Почему индекс не используется в запросе LIKE с подстановочными знаками?

Хотя столбец Title был добавлен в качестве индекса с помощью следующего запроса:

ALTER TABLE Recipe ADD INDEX Title_idx (Title)

MySQL не использует этот индекс для этого запроса:

SELECT * FROM Recipe
WHERE Title LIKE '%cake%';

Я использовал ключевое слово EXPLAIN, а ключевое поле — NULL.

Как это решить? Я должен улучшить этот запрос.


person Fabio    schedule 19.06.2015    source источник
comment
MySQL не может использовать индекс, если у вас есть подстановочный знак % в начале строки. Если бы ваш запрос был LIKE 'cake%', использовался бы индекс.   -  person Michael Berkowski    schedule 19.06.2015
comment
@MichaelBerkowski: Если вы знаете ответ, напишите его как один. Комментарии предназначены для запроса разъяснений.   -  person Lightness Races in Orbit    schedule 19.06.2015
comment
@LightnessRacesinOrbit Я ищу дубликат, который, как я знаю, существует. Держись крепче...   -  person Michael Berkowski    schedule 19.06.2015
comment
Я понял, но поскольку я не могу использовать индексы, как я могу улучшить свой поисковый запрос?   -  person Fabio    schedule 19.06.2015
comment
Спасибо всем. Поскольку в MySQL 5.6 появились полнотекстовые индексы для InnoDB, я буду использовать их. Просто вопрос @MichaelBerkowski: Должен ли я удалить свой вопрос, так как он дублируется?   -  person Fabio    schedule 19.06.2015
comment
@ Фабио Нет, можно оставить его, потому что он появится в поиске, чтобы указать на более полные ответы. (особенно если я немного подредактирую заголовок)   -  person Michael Berkowski    schedule 19.06.2015


Ответы (2)


Вам нужен полнотекстовый индекс для частичного соответствия. Рассмотрим обычный индекс, такой как телефонная книга: он отлично подходит для поиска людей по фамилии, а затем по имени, скажем, «Смит, Джон», но бесполезен для поиска людей с «ит» в имени, вам придется пройти через запись по запись вручную сопоставление.

Любой запрос, который говорит LIKE '%x%', автоматически будет сканированием таблицы. Это не будет масштабироваться для таблиц нетривиального размера.

person tadman    schedule 19.06.2015
comment
Как я могу использовать полнотекстовый индекс? - person Fabio; 19.06.2015
comment
Как и везде, первым шагом является чтение документации по полному текстовые индексы. - person tadman; 19.06.2015

Потому что индекс начинается с начала строки. Поскольку вы ищете подстроку в ЛЮБОЙ позиции в заголовке, индекс использовать нельзя.

Это может использовать индекс

WHERE Title LIKE 'cake%';

но это не

WHERE Title LIKE '%cake%';
person juergen d    schedule 19.06.2015