Оптимизатор запросов MySQL видит, что индексный обход индекса даты включает погружение в кластеризованный индекс (известный как gen_clust_index ). В свете этого, MySQL Query Optimizer решил, что проще выполнить полное сканирование таблицы в первом запросе и полное сканирование индекса во втором запросе.
Вам также может понадобиться посмотреть количество элементов в индексе и количество строк в каждом отдельном значении.
Выполните следующее:
SELECT COUNT(1) datecount,`date` FROM test1_nopart GROUP BY `date` WITH ROLLUP;
Согласно вашему комментарию, вы получите 6077 отдельных строк. Вы также сказали, что есть около 10 000 000 строк. Вместо этого запустите этот запрос:
SELECT COUNT(1) datecount FROM test1_nopart WHERE `date` = '2014-03-14';
Обратите внимание на количество и общее количество.
5% от 10 000 000 составляет 500 000
Если существует более 500 000 строк с датой «2014-03-14», MySQL никогда не будет правильно использовать индекс для этого конкретного значения.
Я не доверяю SHOW INDEXES FROM test1_nopart;
, потому что таблица InnoDB. MyISAM покажет точное число. InnoDB производит числа, основанные на погружениях в указатель.
Если число дат какой-либо даты превышает 5% от общего числа строк, MySQL Query Optimizer поднимает руки и делает полное сканирование.
UPDATE
Хорошо, что 5% эмпирического правила за пределами окна Попробуйте обмануть MySQL Query Optimizer, создав другой индекс покрытия:
ALTER TABLE test1_nopart ADD INDEX date_id_ndx (`date`,id);
и попробуйте снова свои вопросы.