MySQL 5.1 在存在索引时使用文件排序事件

标签 mysql performance optimization filesort

可能我遗漏了一些愚蠢的东西...显然 MySQL 5.1 会继续执行文件排序,即使存在与 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;

我的问题是一个简单的 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

关于MySQL 5.1 在存在索引时使用文件排序事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6114880/

相关文章:

mysql - Liquibase 主键在 H2 上创建了两次

PHP SMTP 邮件脚本不起作用

MySQL 如何对带有连接的查询执行 COUNT(*)?

sql-server - SQL Server - 使用按位运算符查找最高优先级的项目

c++ - 使编译器/优化器能够更快地编写程序的编码实践

java - JAVA中以下方法声明、实例化和初始化数组的时间复杂度有什么区别吗?

oracle - 关闭 Oracle 中的索引

mysql - 争论希腊字符

python - 提高函数运行时间

ios - 有没有办法检查是否堆叠了太多VC