Почему MySQL не использует мой индекс? - PullRequest
0 голосов
/ 10 августа 2011

Если у меня есть следующая таблица:

CREATE TABLE `mytable` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(64) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name_first_letter` (`name`(1)),
  KEY `name_all` (`name`)
)

Будет ли MySQL когда-либо использовать индекс name_first_letter вместо индекса name_all?Если да, то при каких условиях это произойдет?

Я провел несколько быстрых тестов и не уверен, что MySQL выберет индекс name_first_letter даже при использовании подсказок индекса:

-- This uses name_all
EXPLAIN SELECT name FROM mytable
WHERE SUBSTRING(name FROM 1 FOR 1) = 'T';

-- This uses no index at all
EXPLAIN SELECT name FROM mytable USE INDEX (name_first_letter)
WHERE SUBSTRING(name FROM 1 FOR 1) = 'T';

Может ли какой-нибудь гуру MySQL пролить свет на это?Есть ли смысл указывать name_first_letter в этом столбце?

Редактировать: Название вопроса было не совсем правильным.

1 Ответ

2 голосов
/ 18 августа 2011

Не имеет смысла использовать индекс для вашего запроса, потому что вы выбираете столбец с полным именем.Это означает, что MySQL не может использовать только индекс для удовлетворения запроса.

Кроме того, я считаю, что MySQL не может понять, что выражение SUBSTRING(name FROM 1 FOR 1) эквивалентно индексу.

Однако MySQL можетиспользуйте индекс, если только один индекс может удовлетворить запрос.Например:

select count(*)
  from mytable
 where name like 'T%';

Но даже это зависит от вашей статистики (подсказка должна работать).

Функция частичного индекса MySQL предназначена для экономии места.Обычно нет смысла иметь как частичный, так и полный индекс столбца.Вы, как правило, бросаете более короткий.Может быть редкий случай, когда это имеет смысл, но вообще не имеет смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...