请问一个 order by 使用索引的问题

59 天前
 xing393939

请问当联合索引是 a,b 时,这 2 个 sql 有啥区别吗:

select * from t where a=1 order by b ASC
select * from t where a=1 order by b DESC
1868 次点击
所在节点    MySQL
11 条回复
gaogao321
59 天前
1 、第一个 SQL 语句( order by b ASC )可以直接利用联合索引 (a, b),因此性能较好。
2 、第二个 SQL 语句( order by b DESC )可能无法完全利用索引 (a, b),需要额外的排序操作,性能可能稍差。
sagaxu
59 天前
返回结果顺序不同,排序跟物理存储顺序一致的,性能可能会略高,顺序读一般比倒序读更快。

但在索引使用上没有区别,整体性能差异不大。
8355
59 天前
我看了半天这两个 sql ,真的陷入沉思。。
真没想到你会问 asc 和 desc 。。。
gaogao321
59 天前
如果你经常需要对 b 列进行降序排序,可以考虑创建一个复合索引 (a, b DESC),这样在执行 order by b DESC 时也能充分利用索引,避免额外的排序操作。
coderzhangsan
59 天前
如#2 所说 创建索引如果不指定排序 默认是升序 因此第二个 SQL 语句相较于第一个 SQL 语句 额外多了一层排序开销 其他与第一个 SQL 语句一致
seedhk
59 天前
一直没关注到排序顺序这点对索引的影响,学习了
cnoder
59 天前
8.0 文档上写:
MySQL 降序索引简介
降序索引是以降序存储键值的索引。在 MySQL 8.0 之前,您可以 DESC 在索引定义中指定。但是,MySQL 忽略了它。与此同时,MySQL 可以以相反的顺序扫描索引,但成本很高。

所以说 8 之前的知识能这么写但是没有用,另外也标注了反序扫描成本高
lasuar
59 天前
索引默认按 ASC ,但可以修改为 DESC 。
rrfeng
59 天前
逆序 != 排序

我认为可以忽略
phithon
59 天前
才知道这一点,学习了
sagaxu
59 天前
@gaogao321
@coderzhangsan
@cnoder

根据 https://dev.mysql.com/doc/refman/8.4/en/order-by-optimization.html#order-by-index-use

SELECT * FROM t1
WHERE key_part1 = constant
ORDER BY key_part2;

SELECT * FROM t1
WHERE key_part1 = constant
ORDER BY key_part2 DESC;

以上两个查询都不会产生 filesort ,有没有 DESC 都一样

根据 https://dev.mysql.com/blog-archive/mysql-8-0-labs-descending-indexes-in-mysql/
由于单向链表不能直接回溯,正向扫描比反向扫描快 15%左右

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1074937

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX