Производительность SQL-запросов LIKE и wildecards против IN - PullRequest
3 голосов
/ 31 января 2012

Я просто удивлюсь, если между этими двумя запросами будет большая разница в производительности

SELECT 
  `items_id`, `sport_id`, `sport`, `title`, `url`, 
  `Select3`, `Select6`, `id`, `data`,`image` as image,
  concat('index.php?option=sports&item=',`items_id`,'&p=C108-M108') as count_url
FROM 
  qy9zh_dataitems
WHERE Select6 LIKE '%sport%'
ORDER BY `Select9` DESC LIMIT 0, 4


SELECT 
  `items_id`, `sport_id`, `sport`, `title`, `url`, 
  `Select3`, `Select6`, `id`, `data`,`image` as image,
  concat('index.php?option=sports&item=',`items_id`,'&p=C108-M108') as count_url
FROM 
  qy9zh_dataitems 
WHERE Select6 in ('sport') 
ORDER BY `Select9` DESC LIMIT 0, 4

Запросы работают просто отлично .. оба они .. просто беспокоятся о производительности:)

Редактировать: Странная вещь, когда я провожу тестирование, это:

SELECT * FROM qy9zh_dataitems WHERE Select6 in ('kvinna') LIMIT 0, 40000

29,051 всего, запрос занял 0,2581 сек

SELECT * FROM qy9zh_dataitems WHERE Select6 LIKE ('%kvinna%') LIMIT 0, 40000

29,113 всего, запрос занял 0,2218 с

Ответы [ 4 ]

5 голосов
/ 31 января 2012

Если для столбца определен индекс, и вы ищете начало этого столбца, как в

name LIKE 'Jo%' 

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

name LIKE '%man%' 

Индекс не может быть использован.

Предложение IN обычно очень быстрое, однако я не знаю, может ли оно воспользоваться индексом.

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

3 голосов
/ 31 января 2012

Они даже не похожи на одинаковые запросы, и поэтому производительность не может быть сравнена.

Второй запрос может использовать индекс на Select6, чтобы ограничить строки теми, которые равны sport, тогда как первый должен смотреть на каждую строку, чтобы увидеть, содержит ли он sport где-либо в содержимом Select6. Вы пытаетесь сравнить яблоки и апельсины.

2 голосов
/ 31 января 2012

Это очень разные критерии.

WHERE Select6 LIKE '%sport%'

будет искать случай, когда select6 содержит слово sport.

WHERE Select6 in ('sport') 

будет искать случай, когда select6 является словом sport.

Критерий IN позволяет вам указать список возможных значений и должен быть очень быстрым, если вы проиндексировали поле.Подобный, особенно подобный, который ищет слово где-либо в строке, может быть трудно вообще проиндексировать.Where select6 like 'sport%' будет искать случай, когда select6 начинается со слова sport и будет индексируемым.

1 голос
/ 31 января 2012

Как и все остальные, базовые индексы не могут быть использованы для поиска с использованием символа подстановки. Если вы думаете, что эти запросы будут наиболее распространенными, вы должны взглянуть на функции полнотекстового поиска в MySQL.

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

Полнотекстовый поиск MySQL

...