Производительность MySQL / ORACLE с использованием LIKE и CONCAT - PullRequest
0 голосов
/ 22 января 2019

Какой из этих двух запросов будет работать лучше в MySQL и / или ORACLE?

SELECT * 
FROM User 
WHERE name LIKE "%searchTerm%"
OR lastname LIKE "%searchTerm%" 
OR email LIKE "%searchTerm%";

или

SELECT * 
FROM User 
WHERE CONCAT(name, " ", lastname, " ", email) LIKE "%searchTerm%";

У меня сильное чувство, что второй, но яхотел бы быть уверен.

Ответы [ 3 ]

0 голосов
/ 22 января 2019

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

Производительность будет одинаковой, поскольку оба запроса выполняют полное сканирование таблицы, а разница только в условии фильтра

Первый запрос

   1 - filter("NAME" IS NOT NULL AND "NAME" IS NOT NULL AND "NAME" LIKE 
              '%searchTerm%' OR "LASTNAME" IS NOT NULL AND "LASTNAME" IS NOT NULL AND 
              "LASTNAME" LIKE '%searchTerm%' OR "EMAIL" IS NOT NULL AND "EMAIL" IS 
              NOT NULL AND "EMAIL" LIKE '%searchTerm%')

Второй запрос

  1 - filter("NAME"||' '||"LASTNAME"||' '||"EMAIL" LIKE '%searchTerm%')

Таким образом, в основном ни один запрос не подходит для поиска клиентов по нетривиальным таблицам .

Обычно вы хотите ограничить поиск до column LIKE 'xxxxxx%', который может использовать индекс.

0 голосов
/ 25 января 2019

(MySQL Answer)

В любом случае потребуется полное сканирование таблицы, поэтому ни один не будет быстрым.(Извлечение строк обходится дороже, чем оценка выражений.) Кроме того, ведущий подстановочный знак подразумевает, что строки должны быть полностью отсканированы;нет INDEX возможно использование.

Если ваш "serachTerm" всегда слово (а), то используйте FULLTEXT(name, lastname, email) и MATCH(name, lastname, email) AGAINST ("+searchTerm" IN BOOLEAN MODE);это будет лот быстрее.

0 голосов
/ 22 января 2019
SELECT * 
FROM User 
WHERE name LIKE "%searchTerm%"
OR lastname LIKE "%searchTerm%" 
OR email LIKE "%searchTerm%";

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

SELECT * 
FROM User 
WHERE CONCAT(name, " ", lastname, " ", email) LIKE "%searchTerm%";

В этом запросе нельзя использовать другой фильтр. Вы должны использовать общий фильтр для всех полей.

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