Параметры текстового поиска MySQL InnoDB

Хорошо зная, что мои таблицы InnoDB не поддерживают поиск FULLTEXT, мне интересно, какие у меня есть альтернативы для поиска текста в таблицах? Эта плохая производительность при использовании LIKE?

Я вижу много предложений о том, чтобы сделать копию рассматриваемой таблицы InnoDB в таблице MYISAM, а затем выполнить запросы к этой таблице и сопоставить ключи между ними, и я просто не знаю, что это красивое решение.

Я не против использования сторонних решений, хотя я не большой их поклонник. Я хотел бы больше узнать о том, что MySQL может делать сам по себе.

Мысли ?


person JHarnach    schedule 29.10.2010    source источник


Ответы (3)



Используя LIKE, можно использовать индекс только тогда, когда нет ведущего%. Выполнение LIKE '% foo%' на большой таблице будет большим ударом по производительности. На вашем месте я бы посмотрел на использование sphinx. Он может создавать свой индекс, извлекая данные из MySQL, используя запрос, который вы предоставляете. Это довольно просто и было разработано для решения вашей конкретной проблемы.

Также существует solr, который представляет собой http-оболочку для lucene, но я считаю, что sphinx немного проще.

person Nomad    schedule 29.10.2010

Я, как и другие, настоятельно рекомендую использовать Lucene, Sphinx или Solr.

Однако, если их нет и ваши требования просты, я использовал шаги здесь для создания простой возможности поиска по ряду проектов в прошлом.

Эта ссылка предназначена для Symfony / PHP, но вы можете применить концепции к любому языку и структуре приложения, предполагая, что существует реализация алгоритма стемминга. Однако, если вы не используете шаблон доступа к данным, где вы можете подключиться для обновления индекса при обновлении записи, это не так легко сделать.

Также есть пара недостатков: если вам нужна одна индексная таблица, но вам нужно проиндексировать несколько таблиц, вам нужно либо имитировать ссылочную целостность в вашем DAL, либо добавить столбец fk для каждой отдельной таблицы, которую вы хотите проиндексировать. Я не уверен, что вы пытаетесь сделать, чтобы это полностью исключить.

person prodigitalson    schedule 29.10.2010