编程笔记

lifelong learning & practice makes perfect

MySQL8 backend index scan

在分析一个sql执行计划

1
2
3
4
5
6
explain  
SELECT id,user_id
FROM `order`
WHERE shop_id = xxx and (corp_id = xxx)
ORDER BY create_time DESC
LIMIT 10

在返回值的extra中看到一个陌生的字眼”Backward index scan”,下面探索下这是个啥

1
Extra:  Using index condition; Backward index scan

是什么

Backward index scan (JSON: backward_index_scan). The optimizer is able to use a descending index on an InnoDB table. Shown together with Using index. For more information, see Section 8.3.13, “Descending Indexes”.
Descending indexes are supported only for the InnoDB storage engine

仅在InnoDB上有效,创建索引时支持指定排序方式,不再忽略索引定义里的参数DESC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- MySQL supports descending indexes: DESC in an index definition is no longer ignored but causes storage of key values in descending order
CREATE TABLE t (
c1 INT, c2 INT,
INDEX idx1 (c1 ASC, c2 ASC),
INDEX idx2 (c1 ASC, c2 DESC),
INDEX idx3 (c1 DESC, c2 ASC),
INDEX idx4 (c1 DESC, c2 DESC)
);

-- usage
ORDER BY c1 ASC, c2 ASC -- optimizer can use idx1
ORDER BY c1 DESC, c2 DESC -- optimizer can use idx4
ORDER BY c1 ASC, c2 DESC -- optimizer can use idx2
ORDER BY c1 DESC, c2 ASC -- optimizer can use idx3

Descending Indexes/降序索引

在MySQL 8中,Descending Indexes是数据库索引的一种类型,用于对数据进行降序排序,在查询最新数据等情况非常有用。
Descending Indexes可以在表的一个或多个列上创建,并且使用方式类似于升序索引。当执行查询时,数据库引擎使用索引快速定位需要的数据,而不是扫描整个表。
降序索引可以改善某些查询的性能,但它们并不适用于所有情况。例如在表上执行的大多数查询需要按升序排序数据,那么降序索引可能不会提供任何性能改进。
因此,需要分析数据和查询模式以确定是否适合使用降序索引。

reference

欢迎关注我的其它发布渠道