Mysql - "Select like" не использует индекс
я играл с индексами на MySQL (5.5.24, WinXP), но я не могу найти причину, почему сервер не использует один индекс, когда это.
пример этого:
Я создал тестовую таблицу:
create table testTable (
id varchar(50) primary key,
text1 varchar(50) not null,
startDate varchar(50) not null
) ENGINE = innodb;
затем, я добавил индекс к startDate
. (Пожалуйста, не спрашивайте, почему столбец является текстом, а не датой.. это просто простой тест):
create index jeje on testTable(startdate);
analyze table testTable;
после этого, я добавил почти 200 000 строк, что, где параметр StartDate было 3 возможных значений. (На каждого приходится одна треть..около 70 000 раз)
Итак, если я запустил объяснить такой:
explain select * from testTable use index (jeje) where startDate = 'aaaaaaaaa';
ответ следующий:
id = 1
select_type = SIMPLE
type = ref
possible_keys = jeje
key = jeje
rows = 88412
extra = Using where
Итак, используется ключ, а количество строк приближается к 200,000/3, поэтому все в порядке.
проблема в том, что если я изменю запрос на: (просто chaning ' = ' на 'LIKE'):
explain select * from testTable use index(jeje) where startDate LIKE 'aaaaaaaaa';
в этом случае ответ есть:
id = 1
select_type = SIMPLE
type = ALL
possible_keys = jeje
key = null
rows = 176824
extra = Using where
таким образом, индекс не используется сейчас(ключ равен null, а строки рядом с полной таблицей..как предполагает тип=all).
документация MySQL говорит, что LIKE использует индексы.
Итак, чего я здесь не вижу? В чем проблема?
Спасибо за вашу помощь.
2 ответов
MySql может игнорировать индекс, если он индексирует доступ к более чем 30% строк таблицы. Вы можете попробовать FORCE INDEX [index_name], он будет использовать index в любом случае.
значение sysvar_max_seeks_for_key также влияет на то, используется индекс или нет:
-
http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_max_seeks_for_key
попробуйте изменить это значение на меньшее число.
поиск аналогичных запросов на SO.
на основе Ubik комментарий, и изменения данных, я обнаружил, что: Индекс IS используется в таких случаях:
- explain select * from testTable force index jeje where startDate like 'aaaaaaadsfadsfadsfasafsafsasfsadsfa%';
- explain select * from testTable force index jeje where startDate like 'aaaaaaadsfadsfadsfasafsafsasfsadsfa%';
- explain select * from testTable force index jeje where startDate like 'aaa';
но индекс не используется, когда я использую этот запрос:
- explain select * from testTable force index jeje where startDate like 'aaaaaaaaa';
исходя из того, что в параметр StartDate столбец все значения имеют одинаковую длину (9 символов), когда я использую запрос, используя команду LIKE и константу 9 символов,возможно MySQL предпочитает не используйте причину из-за некоторого алгоритма производительности и перейдите к таблице.
моя забота заключалась в том, чтобы увидеть, не делаю ли я какую-то ошибку в своих исходных тестах, но теперь я думаю, что индекс и тесты правильны, и что MySQL в некоторых случаях решает не использовать индекс... и я передам это.
для меня это закрытая задача. Если кто-то хочет добавить что-то в поток, добро пожаловать.