我创建了一个这样的表:
CREATE TABLE `testtable` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime NOT NULL,
`updated_at` timestamp NOT NULL,
PRIMARY KEY (`id`),
KEY `test_updated_at_index` (`updated_at`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
关于选择的解释说它正在使用filesort:
mysql> explain select * from testtable order by updated_at;
+----+-------------+-----------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------+------+---------+------+------+----------------+
| 1 | SIMPLE | testtable | ALL | NULL | NULL | NULL | NULL | 1 | Using filesort |
+----+-------------+-----------+------+---------------+------+---------+------+------+----------------+
为什么不使用索引?另外,如果我只删除created_at列,那么它会使用索引!
为什么添加一个额外的列会导致mysql忘记如何使用索引?
如何更改表格,以便mysql使用索引排序,即使有其他列?
答案 0 :(得分:0)
没有WHERE子句,因此您可以从表中读取所有记录。通常,直接读取表格的速度更快,即使您必须对数据进行排序,而不是循环索引并分别选取每个记录。
只有当你只对表的一小部分感兴趣时,比如2%的数据,才有意义使用索引。或者,如果您当时只对索引列感兴趣。