Mysql - "Выбрать как", не используя индекс

Я играл с индексами в MySQL (5.5.24, WinXP), но я не могу найти причину того, почему сервер не использует один индекс, когда используется LIKE.

Пример:

Я создал тестовую таблицу:

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, например:

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 и строки рядом с полной таблицей.).

Документация MySQL говорит, что LIKE DOES использует индексы.

Итак, что я не вижу здесь? Где проблема?

Спасибо за вашу помощь.

8
задан Diego Buzzalino 20 авг. '12 в 0:08
источник поделиться
2 ответов

Основываясь на комментарии 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';

Но индекс используется NOT, когда я использую этот запрос:

- explain select * from testTable force index jeje where startDate like 'aaaaaaaaa';

Исходя из того, что в столбце startDate все значения имеют одинаковую длину (9 символов), когда я использую запрос с использованием команды LIKE и константы из 9 символов, PERHAPS MySQL предпочитает не использовать причину из-за некоторого алгоритма производительности и идет в таблицу.

Моя забота заключалась в том, чтобы увидеть, что я делаю какую-то ошибку в своих оригинальных тестах, но теперь я думаю, что индекс и тесты верны, и что MySQL в некоторых случаях решает не использовать индекс... и я будет ретранслировать это.

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

1
ответ дан Diego Buzzalino 20 авг. '12 в 17:20
источник поделиться

MySql может игнорировать индекс, если индекс индексирует доступ к более чем 30% строк таблицы. Вы можете попробовать FORCE INDEX [index_name], он будет использовать индекс в любом случае.

Значение sysvar_max_seeks_for_key также влияет на использование индекса или нет:

Искать похожие запросы на SO.

7
ответ дан UBIK LOAD PACK 20 авг. '12 в 9:30
источник поделиться

Другие вопросы по меткам или Задайте вопрос