Driver86
@Driver86
Немодератор toster.ru

Будет ли использоваться индекс в запросе вида WHERE `field1` LIKE '_aa_a_'?

Часто слышу, что если в запросе "%" вначале, то индекс не будет использоваться.
Но будет ли использоваться индекс в запросе вида WHERE `field1` LIKE '_aa_a_'?
Т.е. неизвестный вначале символ только один.
БД - Mysql, innodb.
И нужен ли полнотекстовой индекс? Или достаточно обычного?
  • Вопрос задан
  • 688 просмотров
Решения вопроса 3
rozhnev
@rozhnev Куратор тега MySQL
Fullstack programmer, DBA, медленно, дорого
Вместо сотни вопросов один ответ: попробуйте и узнаете online sql editor
Ответ написан
Комментировать
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
Нет разницы, один или 10.
Для простоты индекс можно рассматривать как отсортированный список.
Если список учеников в классном журнале отсортирован по алфавиту, то вы довольно быстро найдёте нужного.
А теперь представьте, что вы по тому же самому списку ищете фамилию, на зная первой буквы. И тут уже без разницы, сколько букв мы не знаем. И одной достаточно, чтобы полностью поломать поиск.

Точно такие же проблемы будут и у базы данных. Вместо отсортированного списка с выходом сразу на нужную букву, придётся тупо искать перебором.

Полнотекстовый индекс также не является чем-то особенным в этом плане. Он устроен по совершенно тупому принципу: грубо говоря, БД берёт текст из колонки, и разбивает его на слова. И строит по этим словам снова точно такой же отсортированный список, с указанием, в каких строках это слово используется. То есть когда мы делаем запрос с match, то mysql находит искомое слово в индексе, и возвращает из него все строки.

И точно так же полнотекстовый индекс не работает, если поставить звёздочку спереди. Мануал так и говорит:
Words match if they begin with the word preceding the * operator

То есть звездочка работает только если поставить её в конце слова.
match against ('класс*') найдёт слово "классный", а '*accный' его уже не найдёт.
То есть БД тебе сразу говорит, что для такого поиска полнотекстовый индекс будет бесполезен.
Ответ написан
Комментировать
@Akina
Сетевой и системный админ, SQL-программист.
будет ли использоваться индекс в запросе вида WHERE `field1` LIKE '_aa_a_'?

50/50 - или будет, или нет.

Однако если он будет использоваться, то не как индекс (сортированный список для выполнения index seek), а как компактная копия таблицы (как несортированный список для выполнения index scan).

Тем не менее профит от использования индекса таким образом может быть, и весьма значительный. Главным образом он определяется соотношением размера записи к размеру поля. И чем это соотношение выше, тем более вероятен профит.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы