2011-05-24 17 views
6

大概我错过了一些愚蠢的事情......显然MySQL 5.1一直在做一个Filesort,即使有一个索引完全匹配ORDER BY子句中的列。它张贴在这里,我过于简单的数据模型,但问题仍然发生:当索引存在时MySQL 5.1使用filesort事件

表定义:

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; 

我的问题是,事件简单的SELECT正显示出“使用文件排序” :

explain select * from event order by date_created desc; 

而结果的查询说明:

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  event ALL NULL  NULL NULL NULL 6  Using filesort 

这种类型的查询有什么方法可以使用做一个文件夹的索引?

在此先感谢大家。

回答

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) 

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

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

0

问:有没有什么办法让这种类型的查询使用索引,而不是做一个文件?

答:要具备运行MySQL使用索引,如果可能的话,尽量:

EXPLAIN SELECT * FROM event FORCE INDEX (date_created) ORDER BY date_created DESC; 

通过使用FORCE INDEX (index_name),这告诉MySQL使用索引的,如果它是在所有可能的。如果缺少该指令,MySQL将选择最有效的方式返回结果集。文件夹可能比使用索引更高效。

+0

在这种情况下,强制的指标实际上将减少对小表的性能(随机I/O的目的,因为整个行不在可用索引树)。如果表格变大,优化器将使用索引。 – 2011-05-24 18:53:13

相关问题