我有下表:
CREATE TABLE 'tableA'(
`col1` int(11) NOT NULL AUTO_INCREMENT,
`col2` varchar(20) NOT NULL,
`col3` int(11) NOT NULL,
`col4` varchar(200) NOT NULL,
`col5` varchar(15) NOT NULL,
`col6` datetime NOT NULL,
PRIMARY KEY (`col1`),
UNIQUE KEY `col2,col3` (`col2`,`col3`),
KEY `col6` (`col6`)
) ENGINE=InnoDB AUTO_INCREMENT=1881208 DEFAULT CHARSET=utf8
我在col6上有一个索引,一个日期时间列。表格中有近2M行,日期范围为1/1/2007至11/27/2012。
当我运行以下内容时,它不使用我的索引:
EXPLAIN SELECT * FROM tableA ORDER BY col6 ASC
+----+-------------+----------+------+---------------+------+---------+------+---------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+---------+----------------+
| 1 | SIMPLE | tableA | ALL | NULL | NULL | NULL | NULL | 1933765 | Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+---------+----------------+
我尝试将datetime字段转换为整数,并将datetime转换为unix时间戳。但是,它仍然不会使用我的索引。我错过了什么?为什么优化器坚持要对大量行进行排序(在本例中为1,933,765行)而不是使用索引?
答案 0 :(得分:3)
由于您没有选择基于索引的任何内容来缩小结果集,因此使用它只会产生额外的工作,通过点查找主表中的每一行进行查找。