当col的顺序有索引时,为什么mysql需要filesort?

时间:2016-01-11 09:43:59

标签: mysql sql indexing query-optimization mysql-5.5

我创建了一个这样的表:

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使用索引排序,即使有其他列?

1 个答案:

答案 0 :(得分:0)

没有WHERE子句,因此您可以从表中读取所有记录。通常,直接读取表格的速度更快,即使您必须对数据进行排序,而不是循环索引并分别选取每个记录。

只有当你只对表的一小部分感兴趣时,比如2%的数据,才有意义使用索引。或者,如果您当时只对索引列感兴趣。