也许我错过了一些愚蠢的事情......显然,即使有一个索引与 ORDER BY 子句中的列完全匹配,MySQL 5.1 也会继续执行文件排序。为了将其发布在这里,我过度简化了数据模型,但问题仍然发生:
表定义:
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
有没有办法让这种类型的查询使用索引而不是进行文件排序?
预先感谢大家。
自从你的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 http://dev.mysql.com/doc/refman/5.1/en/how-to-avoid-table-scan.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)