Я ве получил эту таблицу:Простой вопрос MySQL индексации
CREATE TABLE IF NOT EXISTS `test1_nopart` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`idAccount` int(10) unsigned NOT NULL,
`data` mediumint(8) unsigned NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`),
KEY `date` (`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Я заполнить эту таблицу с 10 000 000 строк. передел по дате однороден
EXPLAIN SELECT * FROM `test1_nopart` WHERE date = "2014-03-04"
Вот результату
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE test1_nopart ALL NULL NULL NULL NULL 7875981 Using where
=> без объяснения 3.6sec для результата 3000 строк (приблизительно)
Как вы можете видеть индекс не используется, и он не является частью столбца possible_keys!
тот же самый запрос с индексом покрытия способом
EXPLAIN SELECT date FROM `test1_nopart` WHERE date = "2014-03-04"
результат:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE test1_nopart index NULL date 3 NULL 7875981 Using where; Using index
=> без объяснения 2.8sec для результата 3000 строк (приблизительно)
Почему MySQL неправильно использует этот индекс (DATE) ???
Информация: - VM-сервер (наш DEV среда, я не знаю, что это аппаратный состав) - MySQL 5.5.8
SHOW INDEX FROM test1_nopart
результат:
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
test1_nopart 0 PRIMARY 1 id A 7875981 NULL NULL BTREE
test1_nopart 1 date 1 date A 6077 NULL NULL BTREE
- На дату 2014-03-04 => 3134 строки
- Суммарный (накопительный) => 7 875 488
- Существует 2556 Differents «дата» значения в таблице
Что выход 'SHOW INDEX FROM test1_nopart', особенно индекс кардинальным? Кроме того, почему имена столбцов называются зарезервированными словами MySQL? –
Ой, кажется, что 6077 очень низок ... – nemenems
Кардинальность - не настоящая проблема. Когда вы запускаете запрос 'SELECT COUNT (1) datecount,' date' FROM test1_nopart GROUP BY 'date' WITH ROLLUP;' вы увидите реальную мощность. Вы также увидите, сколько строк занимает 2014-03-14. – RolandoMySQLDBA