【问题标题】:Why does mysql require filesort when the order by col has an index?当 col 的 order 有索引时,为什么 mysql 需要文件排序?
【发布时间】:2016-01-11 09:43:58
【问题描述】:

我创建一个这样的表:

CREATE TABLE `testtable` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime NOT NULL,
`updated_at` timestamp NOT NULL,
PRIMARY KEY (`id`),
KEY `test_updated_at_index` (`updated_at`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

并且 select 上的说明说它正在使用文件排序:

mysql> explain select * from testtable order by updated_at;
+----+-------------+-----------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table     | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+-----------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | testtable | ALL  | NULL          | NULL | NULL    | NULL |    1 | Using filesort |
+----+-------------+-----------+------+---------------+------+---------+------+------+----------------+

为什么不使用索引?此外,如果我只是删除 created_at 列,那么它确实使用索引!

为什么添加一个额外的列会导致mysql忘记如何使用索引?

如何更改表以便 mysql 使用索引进行排序,即使有额外的列?

【问题讨论】:

    标签: mysql sql indexing query-optimization mysql-5.5


    【解决方案1】:

    没有 WHERE 子句,因此您从表中读取所有记录。大多数情况下,直接读取表格要快得多,即使您必须在之后对数据进行排序,而不是遍历索引并分别挑选每条记录。

    只有当您只对表的一小部分感兴趣时,比如 2% 的数据,使用索引才有意义。或者,如果您只对索引列感兴趣,当然。

    【讨论】:

    • 不确定以下。索引的全部意义在于值已经在其中排序。按顺序读出树的内容总是比对未排序的列表进行排序更有效——例如O(n) 与 O(nlogn)
    • 听起来更好:1)从磁盘读取文件(表),对其进行排序,显示数据。 2)从一个文件(索引)中读取一条记录,使用该信息从另一个文件(表)中读取一条记录,从第一个文件(索引)中读取下一条记录,使用该信息从该文件中读取一条记录其他文件(表格),依此类推。
    • 表中的数据是未排序的,所以你可能要读取物理块A为第一条记录,物理块Z为第二条,再次块A为下一条,然后块B,A, Z, B, ... 所以你必须一次又一次地从磁盘中获取相同的数据块。通过顺序读取,您只需读取块 A、B、... Z 一次。在访问数据库中的数据时,通常是磁盘访问成本最高。
    • 当您只想读取少量记录时,索引非常有用,因此您通常不必读取表的所有物理块。或者当索引本身已经包含您感兴趣的所有列时,您根本不必读取该表。
    • “即使我添加了 where 子句”——这不仅仅是添加 WHERE。它是 (1) 可以使用索引的 WHERE,以及 (2) 选择的行少于 ~20%。 (典型的截止值约为 10-30%;超过 Thorsten 的 2%。)
    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    相关资源
    最近更新 更多