Ускорьте утверждение MYSQL LIKE "% word%" - PullRequest
1 голос
/ 24 марта 2011

Текущий запрос:

SELECT * FROM 'fnx_sports' WHERE (Title LIKE '%base%' OR Title LIKE '%ball%')

Приведенный выше запрос займет около 0,0300 секунд.

Более быстрый запрос:

SELECT * FROM 'fnx_sports' WHERE (Title LIKE 'base%' OR Title LIKE 'ball%')

Приведенный выше запрос займет около 0,0010 секунд.

Проблема:

Мне нужны результаты первого запроса, так как второй (более быстрый) запрос не имеет подстановочного знака в начале (что позволяет использовать индексы).

Какие у меня есть варианты?

Один из вариантов - иметь отдельную таблицу, которая содержит все ключевые слова из поля «Заголовок», однако это не подходит, поскольку я ищу поиск по символам, а не по ключевым словам.

Например, следующий запрос также должен работать:

SELECT * FROM 'fnx_sports' WHERE (Title LIKE 'b%' OR Title LIKE 'b%' OR TitleReversed LIKE 'b%' OR TitleReversed LIKE 'b%')

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

Примечание: Невозможно использовать полнотекстовый формат, поскольку у меня есть таблица, которая становится довольно большой и требует постоянных вставок и выборок, поэтому я использую INNODB вместо MYISAM, который требуется для полнотекстового поиска.

Ответы [ 3 ]

2 голосов
/ 24 марта 2011

Может быть, посмотрите на Lucene и Sphinx .

См .:

Насколько Postgres быстрее, чем MYSQL, при полнотекстовом поиске?

(особенно ответ peufeu)

1 голос
/ 24 марта 2011

Поскольку вы используете InnoDB и возможность переключиться на внешнюю поисковую систему (которая является лучшей и самой быстрой), например, Lucene или Sphinx, уже упоминалось здесь и другой подход:

Если результаты не нужно отображать сразу в поиске, вы можете периодически запускать cronjob (например, раз в час), который вставляет новые строки в таблицу InnoDB в отдельную таблицу 'searchindex', которая является MyISAM с полнотекстовым индексом и используется только для поиска.

0 голосов
/ 24 марта 2011

Вы всегда ищете целые слова или хотя бы начало слова?

Если это так, вы можете разбить слова на отдельные таблицы, чтобы в "Base Ball Mania" было три записи в таблице "Base", Ball "и" Mania ", которые можно индексировать и искать.

Очевидно, что это не сработает, если вы ищете "мяч", и есть запись для "бейсбол".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...