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?
在此先感谢大家.
由于您的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
| 归档时间: |
|
| 查看次数: |
1257 次 |
| 最近记录: |