Подтвердить что ты не робот

Какой SQL-запрос лучше, СОГЛАСНО ПРОТИВ или КАК?

Чтобы выполнить поиск в базе данных для строк с двумя ключевыми словами "foo" AND "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 не работает.

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

4b9b3361

Ответ 1

Update

Как и в MySQL 5.6, а затем InnoDB таблицы поддерживают Match... Against.


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

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

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

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

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