MySQL 5.1在索引存在时使用filesort事件

Xav*_*ier 6 mysql optimization performance filesort

可能我错过了一些愚蠢的事情......显然MySQL 5.1仍然在做一个Filesort,即使有一个索引与ORDER BY子句中的列完全匹配.要在此发布,我已经过度简化了数据模型,但问题仍然存在:

表定义:

CREATE TABLE `event` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `owner_id` int(11) DEFAULT NULL,
  `date_created` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `owner_id` (`owner_id`),
  KEY `date_created` (`date_created`),
  CONSTRAINT `event_ibfk_1` FOREIGN KEY (`owner_id`) REFERENCES `user_profile` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

我的问题是,一个简单的SELECT事件显示"正在使用filesort":

explain select * from event order by date_created desc;
Run Code Online (Sandbox Code Playgroud)

并且查询的结果解释了:

id  select_type table   type    possible_keys   key key_len ref rows    Extra   
1   SIMPLE      event   ALL NULL        NULL    NULL    NULL    6       Using filesort
Run Code Online (Sandbox Code Playgroud)

有没有办法让这种类型的查询使用执行filesort的索引insteas?

在此先感谢大家.

Chr*_*gan 3

由于您的CREATE TABLE语句表明您的行数少于 10 行 ( AUTO_INCREMENT=7) 并且FORCE INDEX在我的安装中使用将使 MySQL 使用索引,我猜测优化器认为表扫描比索引扫描更快(随机 I/O 更少)(因为您正在选择所有列,而不仅仅是date_created)。这通过以下事实得到证实:

mysql> explain select date_created from event order by date_created;
+----+-------------+-------+-------+---------------+--------------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key          | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+--------------+---------+------+------+-------------+
|  1 | SIMPLE      | event | index | NULL          | date_created | 9       | NULL |    1 | Using index |
+----+-------------+-------+-------+---------------+--------------+---------+------+------+-------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

在上面的情况下,索引扫描速度更快,因为只需要返回索引列。

MySQL 文档在某些情况下使用索引被认为较慢:http://dev.mysql.com/doc/refman/5.1/en/how-to-avoid-table-scan.html