我有这张桌子:
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.6 秒,结果为 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.8 秒,结果为 3000 行(大约)
为什么 MySQL 不能正确使用这个索引(日期)???
信息: - VM Server(我们的开发环境,我不知道硬件组成是什么) - 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 个不同的“日期”值