【发布时间】:2012-01-30 01:16:47
【问题描述】:
我有这张桌子:
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
=> 3000 行的结果(大约)没有解释 3.6 秒
如您所见,该索引未使用,并且它不是 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
=> 3000 行的结果(大约)没有解释 2.8 秒
为什么 MySQL 不能正确使用这个索引(DATE)???
信息: - 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 个不同的“日期”值
【问题讨论】:
-
SHOW INDEX FROM test1_nopart的输出是什么,尤其是索引基数?另外,为什么要将列命名为 MySQL 的保留字? -
哎呀,看来6077很低了……
-
基数不是真正的问题。当您运行查询
SELECT COUNT(1) datecount,date` FROM test1_nopart GROUP BYdateWITH ROLLUP;` 您将看到真正的基数。您还将看到 2014-03-14 占用了多少行。
标签: mysql date indexing explain covering-index