Вопрос

Кто-нибудь знает, в чем сложность SQL LIKE оператор для самых популярных баз данных?

Это было полезно?

Решение

Давайте рассмотрим три основных случая по отдельности.Это обсуждение специфично для MySQL, но может также применяться к другим СУБД из-за того факта, что индексы обычно реализуются аналогичным образом.

LIKE 'foo%' выполняется быстро, если выполняется в индексированном столбце. Индексы MySQL являются разновидностью B-деревьев, поэтому при выполнении этого запроса он может просто спуститься по дереву к узлу, соответствующему foo, или первый узел с этим префиксом, и пройдите по дереву вперед.Все это очень эффективно.

LIKE '%foo' не может быть ускорен с помощью индексов и приведет к полному сканированию таблицы. Если у вас есть другие критерии, которые могут быть выполнены с использованием индексов, он будет сканировать только те строки, которые остаются после первоначальной фильтрации.

Но тут есть одна хитрость:Если вам нужно выполнить сопоставление суффиксов - поиск имен файлов с расширением .foo, например - вы можете добиться такой же производительности, добавив столбец с тем же содержимым, что и исходный, но с символами в обратном порядке.

ALTER TABLE my_table ADD COLUMN col_reverse VARCHAR (256) NOT NULL;
ALTER TABLE my_table ADD INDEX idx_col_reverse (col_reverse);
UPDATE my_table SET col_reverse = REVERSE(col);

Поиск строк с помощью col заканчивающийся на .foo затем становится:

SELECT * FROM my_table WHERE col_reverse LIKE 'oof.%'

Наконец, есть LIKE '%foo%', для которых нет коротких путей. Если нет других ограничивающих критериев, которые уменьшали бы количество строк до допустимого числа, это сильно снизит производительность.Возможно, вы захотите вместо этого рассмотреть решение для полнотекстового поиска или какое-нибудь другое специализированное решение.

Другие советы

Если вы спрашиваете о влиянии на производительность:

Проблема like заключается в том, что он не позволяет базе данных использовать индекс.В Oracle, я думаю, он больше не использует индексы (но я все еще работаю в Oracle 9).SQLServer использует индексы, если подстановочный знак находится только в конце.Я не знаю о других базах данных.

Зависит от СУБД, данных (и, возможно, размера данных), индексов и того, как используется ПОДОБНОЕ (с префиксным шаблоном или без него)!

Вы задаете слишком общий вопрос.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top