Нет, это в значительной степени то, что они делают. Теперь, если нет подстановочного знака в начале, и поле индексируется, что является обычной ситуацией, ядро базы данных может применять регулярное выражение к индексу. Так, например, если вы пишете
SELECT *
FROM employees
WHERE last_name LIKE 'Cav%'
база данных может использовать индекс, LAST_NAME
чтобы найти все строки, где фамилия начинается с «Cav». С другой стороны, если у вас было что-то вроде
SELECT *
FROM employees
WHERE last_name LIKE '%av%'
база данных должна будет сканировать всю таблицу (или весь индекс) и сравнивать выражение с полным LAST_NAME
значением. Очевидно, это очень дорого.
Большинство лучших реляционных баз данных имеют возможности для более полнотекстового поиска более эффективным способом, создавая различные виды индексов и текстовых каталогов, но они не используют ключевое слово LIKE. Например, вот хорошая статья, которая обсуждает полнотекстовый поиск в PostgreSQL .
LAST_NAME
быть кандидатом (первый столбец в) кластерного индекса? pps, в какой степени этот ответ предполагает, что система баз данных основана на непрерывном хранении на дисковых и B-древовидных индексах?В дополнение к тому, что написал Джастин Кейв, начиная с PostgreSQL 9.1, вы можете ускорить любой поиск с помощью
LIKE
(~~
) илиILIKE
(~~*
), а также базовых совпадений с регулярными выражениями (~
). Используйте классы операторов, предоставляемые модулем pg_trgm с индексом GIN или GiST, чтобы ускоритьLIKE
выражения, которые не привязаны слева. Чтобы установить расширение, запустите один раз для каждой базы данных:Создайте индекс формы
Или:
Создание и ведение индекса GIN или GiST сопряжено с определенными затратами, но если ваша таблица написана не сильно, это отличная возможность для вас.
Депес написал отличную статью в своем блоге о новой функции.
Джин или ГИСТ?
Эти две цитаты из руководства должны служить руководством
Но для запросов типа «ближайший сосед» с использованием оператора расстояния
<->
:источник
Говоря о MySQL, положение символа подстановки (%) имеет значение. Если первая часть текста указана как
where first_name like 'Sta%'
, то механизм БД будет искать только меньшее подмножество слов, начинающихся с S, затем переходящих в St, затем в Sta и т. Д. Если вы делаете что-то подобноеwhere first_name like '%stan%'
, то и полное сканирование столбец будет обязательным. Вы также можете просмотреть полнотекстовые индексы, которые также выполняют поиск на естественном языке. Проверьте документы MySQL здесь.источник