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 также влияет на то, используется индекс или нет:

поиск аналогичных запросов на 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 в некоторых случаях решает не использовать индекс... и я передам это.

для меня это закрытая задача. Если кто-то хочет добавить что-то в поток, добро пожаловать.