MySQL MATCH () AGAINST () против REGEXP для сопоставления целых слов - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь оптимизировать поиск в своем словаре (109 000 записей, MyISAM, FULLTEXT), и теперь я сравниваю производительность MATCH() AGAINST() с REGEXP '[[:<:]]keyword1[[:>:]]' AND table.field REGEXP '[[:<:]]keyword2[[:>:]]'.

Используя два ключевых слова, яполучить (внутри PhpMyAdmin) 0,0000 секунд или 0,0010 секунд для запроса MATCH() AGAINST() против 0,1962 секунд или 0,2190 секунд для регулярного выражениязапрос.Является ли скорость единственным показателем, который здесь имеет значение?Какой запрос мне выбрать (оба, кажется, дают одинаковые результаты)?Это очевидно - быстрее?

Вот полные запросы:

SELECT * FROM asphodel_dictionary_unsorted 
JOIN asphodel_dictionary_themes ON asphodel_dictionary_unsorted.theme_id = asphodel_dictionary_themes.theme_id 
LEFT JOIN asphodel_dictionary_definitions ON asphodel_dictionary_unsorted.term_id = asphodel_dictionary_definitions.term_id 
WHERE MATCH (asphodel_dictionary_unsorted.english) 
AGAINST ('+boiler +pump' IN BOOLEAN MODE)

и

SELECT * FROM asphodel_dictionary_unsorted 
JOIN asphodel_dictionary_themes ON asphodel_dictionary_unsorted.theme_id = asphodel_dictionary_themes.theme_id 
LEFT JOIN asphodel_dictionary_definitions ON asphodel_dictionary_unsorted.term_id = asphodel_dictionary_definitions.term_id 
WHERE asphodel_dictionary_unsorted.english REGEXP '[[:<:]]boiler[[:>:]]' 
AND asphodel_dictionary_unsorted.english REGEXP '[[:<:]]pump[[:>:]]' 
ORDER BY asphodel_dictionary_unsorted.theme_id, asphodel_dictionary_unsorted.english

1 Ответ

0 голосов
/ 03 марта 2019

Решение MATCH/AGAINST использует индекс FULLTEXT и выполняет поиск по индексу довольно эффективно.

Решение REGEXP не может использовать индекс.Он всегда вызывает сканирование таблицы и проверяет каждую строку с помощью регулярного выражения.По мере роста вашей таблицы выполнение REGEXP запросов будет занимать больше времени в линейной пропорции по отношению к количеству строк.

Я провел презентацию Сброс полнотекстового поиска несколько лет назад, где ясравнил полнотекстовые индексы с LIKE и REGEXP.С выборочными данными в 7,4 миллиона строк, REGEXP занял 7 минут 57 секунд, тогда как поиск по индексу InnoDB FULLTEXT в логическом режиме занял 350 миллисекунд - запрос MATCH/AGAINST был в 1363 раза быстрее.

Разница увеличивается даже больше, чем больше у вас строк.

...