Какой SQL-запрос лучше, MATCH AGAINST или LIKE? - PullRequest
66 голосов
/ 27 апреля 2009

Для поиска в базе данных строк, в которых есть ключевые слова "foo" И "bar" в любом из столбцов "foo_desc" и "bar_desc", я бы сделал что-то вроде:

SELECT * 
FROM t1 
WHERE MATCH (t1.foo_desc, t2.bar_desc) AGAINST ('+foo* +bar*' IN BOOLEAN MODE)

или

SELECT * 
FROM t1 
WHERE (CONCAT(t1.foo_desc, t2.bar_desc) LIKE '%foo%') AND (CONCAT(t1.foo_desc, t2.bar_desc) LIKE '%bar%')

Я ожидаю, что недостатком последнего запроса будет производительность.

Положительным моментом является то, что запрос LIKE находит 'xxfoo', а MATCH AGAINST - нет.

Какой из них предпочтительнее или есть лучшее решение?

1 Ответ

62 голосов
/ 27 апреля 2009

Обновление

Начиная с MySQL 5.6 и более поздних версий, таблицы InnoDB поддерживают Match... Against.


Первый намного лучше. В таблицах MyISAM будет использоваться полнотекстовый индекс для этих столбцов. Другой выполнит полное сканирование таблицы, выполнив конкатат по каждой строке, а затем проведет сравнение.

LIKE эффективен, только если вы делаете это против:

  • столбец (не результат функции, если только ваш конкретный поставщик баз данных не поддерживает функциональные индексы - например, Oracle - и вы используете их);
  • начало столбца (т.е. LIKE 'blah%' в отличие от LIKE '%blah%'); и
  • столбец, который проиндексирован.

Если какое-либо из этих условий не выполняется, единственным механизмом SQL для выполнения запроса является полное сканирование таблицы. Это может быть использовано под 10-20 тысяч строк. Однако после этого он быстро становится непригодным для использования.

Примечание: Одна из проблем с MATCH в MySQL заключается в том, что он, похоже, сопоставляется только с целыми словами, поэтому при поиске «bla» столбец не будет соответствовать значению «blah», но поиск 'bla *' будет.

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