请问当联合索引是 a,b 时,这 2 个 sql 有啥区别吗:
select * from t where a=1 order by b ASC
select * from t where a=1 order by b DESC
1
gaogao321 59 天前 1
1 、第一个 SQL 语句( order by b ASC )可以直接利用联合索引 (a, b),因此性能较好。
2 、第二个 SQL 语句( order by b DESC )可能无法完全利用索引 (a, b),需要额外的排序操作,性能可能稍差。 |
2
sagaxu 59 天前
返回结果顺序不同,排序跟物理存储顺序一致的,性能可能会略高,顺序读一般比倒序读更快。
但在索引使用上没有区别,整体性能差异不大。 |
3
8355 59 天前
我看了半天这两个 sql ,真的陷入沉思。。
真没想到你会问 asc 和 desc 。。。 |
4
gaogao321 59 天前 1
如果你经常需要对 b 列进行降序排序,可以考虑创建一个复合索引 (a, b DESC),这样在执行 order by b DESC 时也能充分利用索引,避免额外的排序操作。
|
5
coderzhangsan 59 天前
如#2 所说 创建索引如果不指定排序 默认是升序 因此第二个 SQL 语句相较于第一个 SQL 语句 额外多了一层排序开销 其他与第一个 SQL 语句一致
|
6
seedhk 59 天前
一直没关注到排序顺序这点对索引的影响,学习了
|
7
cnoder 59 天前
8.0 文档上写:
MySQL 降序索引简介 降序索引是以降序存储键值的索引。在 MySQL 8.0 之前,您可以 DESC 在索引定义中指定。但是,MySQL 忽略了它。与此同时,MySQL 可以以相反的顺序扫描索引,但成本很高。 所以说 8 之前的知识能这么写但是没有用,另外也标注了反序扫描成本高 |
8
lasuar 59 天前
索引默认按 ASC ,但可以修改为 DESC 。
|
9
rrfeng 59 天前
逆序 != 排序
我认为可以忽略 |
10
phithon 59 天前
才知道这一点,学习了
|
11
sagaxu 59 天前 2
@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%左右 |