SQL `LIKE` сложность - PullRequest
       14

SQL `LIKE` сложность

2 голосов
/ 29 апреля 2009

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

Ответы [ 3 ]

11 голосов
/ 29 апреля 2009

Давайте рассмотрим три основных случая отдельно. Это обсуждение относится к 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%', для которого нет ярлыков. Если нет других ограничивающих критериев, которые уменьшают количество строк до допустимого числа, это приведет к серьезному снижению производительности. Возможно, вы захотите рассмотреть решение для полнотекстового поиска или другое специализированное решение.

1 голос
/ 29 апреля 2009

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

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

1 голос
/ 29 апреля 2009

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

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

...