Используя IN или текстовый поиск - PullRequest
6 голосов
/ 03 ноября 2008

Я хочу найти таблицу, чтобы найти все строки, где одно конкретное поле является одним из двух значений. Я точно знаю, какими будут значения, но мне интересно, какой самый эффективный способ их поиска:

для примера, двумя значениями являются "xpoints" и "ypoints". Я точно знаю, что в этом поле не будет других значений, в конце которых есть «точки», поэтому я рассматриваю два запроса:

WHERE `myField` IN ('xpoints', 'ypoints')
--- or...
WHERE `myField` LIKE '_points'

что даст лучшие результаты в этом случае?

Ответы [ 5 ]

14 голосов
/ 03 ноября 2008

Как всегда с запросами SQL, запустите его через профилировщик, чтобы выяснить это. Однако мой внутренний инстинкт должен был бы сказать, что поиск IN будет быстрее. Особенно в приведенном вами примере, если бы поле было проиндексировано, ему потребовалось бы только 2 поиска. Если вы выполнили поиск по аналогии, возможно, вам придется выполнить сканирование, потому что вы ищете записи, которые заканчиваются определенным значением. Это также будет более точным, так как LIKE '_points' также может возвращать 'gpoints' или любую другую подобную строку.

1 голос
/ 03 ноября 2008

Если все элементы данных в рассматриваемом столбце не начинаются с 'x' или 'y', я считаю, что IN всегда даст вам лучший запрос. Если он проиндексирован, как указывает @Kibbee, вам нужно будет выполнить только 2 поиска, чтобы получить оба. В качестве альтернативы, если он не проиндексирован, при сканировании таблицы с использованием IN большую часть времени нужно будет проверять только первую букву, тогда как в случае LIKE ему придется каждый раз проверять два символа (при условии, что все элементы содержат не менее 2 символов), поскольку первый символ может быть любым.

0 голосов
/ 04 ноября 2008

IN-версия будет быстрее, чем LIKE-версия. Особенно, когда ваш подстановочный знак не находится в конце сравнения, но даже в идеальных условиях IN все равно будет идеальным, пока ваш запрос не приблизится к размеру вставки вашего максимального запроса.

0 голосов
/ 04 ноября 2008

MySQL не может использовать индекс при использовании сравнения строк, например LIKE "% foo" или "_foo", но может использовать индекс для сравнения, например "foo%" и "foo _".

Так что в вашем случае IN будет намного быстрее, если поле будет проиндексировано.

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

0 голосов
/ 03 ноября 2008

Попробуйте и посмотрите. Создайте большое количество тестовых данных. Попробуйте также с индексом myfield и без него. Пока вы на это, посмотрите, есть ли заметная разница между LIKE ' points' и LIKE 'xpoint '.

Это зависит от того, что оптимизатор делает с каждым запросом.

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

Могу поспорить, что IN даст вам лучшие результаты, чем LIKE, если на myfield есть индекс. Я также держу пари, что xpoint_ работает быстрее, чем _points. Но нет ничего лучше, чем попробовать это самому.

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