Это дело требует InnoDB или MyISAM?


Я выполняю поиск по таблице (несколько внутренних соединений), который занимает максимум 5 секунд (7,5 миллиона строк). Это таблица MyISAM, и я не использую полнотекстовое индексирование на ней, поскольку я обнаружил, что нет никакой разницы в скорости при использовании MATCH AGAINST и нормального оператора "like" в этом случае от того, что я могу видеть.

Теперь я "страдаю" от заблокированных таблиц и запросов, выполняемых в течение нескольких минут, прежде чем они завершатся из-за этого.

Будет ли мне вообще полезно попытаться переключить двигатель к InnoDB? Или это помогает только в том случае, если мне нужно вставить или обновить строки... не просто выбрать их? Вся эта история с замком стола занята тем, что перемалывает мне яйца...

2 4

2 ответа:

Разница между блокировкой на уровне строк и на уровне таблиц важна только для запросов insert и update. Если вы в основном делаете выбор (поэтому вставки / обновления не происходят слишком часто, чтобы заблокировать таблицу), разница не будет такой уж большой (хотя в последних тестах InnoDB, кажется, превосходит MyISAM).

Другие способы, о которых вы могли бы подумать, - это реорганизация структуры данных, возможно, включая дополнительную таблицу поиска с "тегами" или "ключевыми словами". Внедрение более эффективный полнотекстовый движок, предложенный webdestroya.

И последнее, но не менее важное: я также удивлен, что вы получили аналогичные результаты с полным текстом vs LIKE. Это может произойти, если поля, которые вы ищете, не очень широки, и в этом случае, возможно, будет достаточно индекса B-дерева stndard с = search?

InnoDB поддерживает блокировку на уровне строк вместо блокировки на уровне таблиц... так что это должно облегчить вашу проблему (хотя я не уверен, что она полностью устранит ее).

Лучше всего использовать специальную поисковую систему (например, Sphinx, Lucene или Solr)