【问题标题】:MySQL does not use effectively use the index for ORDER BY queriesMySQL 没有有效地使用索引进行 ORDER BY 查询
【发布时间】:2009-09-07 08:51:14
【问题描述】:

我有一个简单的 Message 表,有 2 个索引:

mysql> show keys from Message;
+---------+------------+-----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+
| Table   | Non_unique | Key_name  | Seq_in_index | Column_name    | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+---------+------------+-----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+
| Message |          0 | PRIMARY   |            1 | id             | A         |     5643295 |     NULL | NULL   |      | BTREE      |         |
| Message |          1 | timestamp |            1 | startTimestamp | A         |     5643295 |     NULL | NULL   |      | BTREE      |         |
+---------+------------+-----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+

通过查询发出订单时,会检查大量行:

mysql> explain SELECT * from Message ORDER BY startTimestamp LIMIT 0,20;
+----+-------------+---------+-------+---------------+-----------+---------+------+---------+-------+
| id | select_type | table   | type  | possible_keys | key       | key_len | ref  | rows    | Extra |
+----+-------------+---------+-------+---------------+-----------+---------+------+---------+-------+
|  1 | SIMPLE      | Message | index | NULL          | timestamp | 8       | NULL | 5643592 |       |
+----+-------------+---------+-------+---------------+-----------+---------+------+---------+-------+

总行数为:

mysql> select count(*) from Message;
+----------+
| count(*) |
+----------+
|  5837363 |
+----------+

此查询涉及 96.7% 的行。索引是BTREE,所以据我所知,它应该简单地拉出前 20 行并返回它们。就目前而言,它使用索引来访问几乎所有表的行,这可能比全表扫描要慢。

我是否错误地假设它应该简单地使用索引选择前 20 行并返回它们?

MySQL服务器版本为5.0.45,表类型为InnoDB。

【问题讨论】:

标签: mysql indexing


【解决方案1】:

在 EXPLAIN 中,MySQL 估计扫描的行数为 5643592,但它使用正确的索引(按列排序:时间戳)并且限制为 20 行,所以不要担心它在做正确的事情并且会停止一旦发送了 20 行。你能给我们查询的执行时间吗?

【讨论】:

  • 够吓人的,你是对的。我试图简化一个问题,但把它简化了。
【解决方案2】:

使用 EXPLAIN SELECT ... ORDER BY,您 可以检查MySQL是否可以使用 索引来解决查询。它 如果您看到 Using filesort in 额外的列。

它正在使用索引..

【讨论】:

  • 对,但是如何减少触摸的行数?理想情况下,它应该只触及 20 行,因为我使用的是 BTREE 索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
相关资源
最近更新 更多