mysql 里面 order by columnA 为什么能利用 columnA 的索引

2022-12-01 11:24:09 +08:00
 movq

假设表tableXid(primary key) name ,age, phone, 都有索引

如果这样查询: select phone from tableX where name='Dennis' order by age

这个过程应该是

  1. 使用 name index 找到所有符合 Dennis 的 id ,记为集合 Set
  2. age index 给集合 Set 排序
  3. 用排序完的 id 去聚簇索引找到phone

但第二步是怎么实现的呢?

我觉得有一种可能是直接在 age 的索引 b+树里面顺序扫描,看扫描到的 id 是不是在 Set 里面,如果是就加入到一个列表。那么这个列表里面就是按照 age 排序号的 id

但这样和顺序扫描有什么区别吗?为什么要用索引呢?

990 次点击
所在节点    程序员
6 条回复
lambdaq
2022-12-01 11:29:39 +08:00
为什么 Java 父类构造函数调用被重写的方法会调用到子类的

mysql 里面会自动为没有主键的表创建聚簇索引吗?

mysql 里面 order by columnA 为什么能利用 columnA 的索引

SpringSecurity 前后端分离的情况下,如何防止 CSRF 攻击?


好家伙。v2ex 大学码农培训学校毕业。。。。
optional
2022-12-01 11:30:04 +08:00
你说的 123 不会同时实现的,要么用 name index 筛选再排序,要么用 age index 按顺序扫描,过滤记录。
fgwmlhdkkkw
2022-12-01 14:29:23 +08:00
@lambdaq #1 惹人厌
zhzy0077
2022-12-01 17:47:49 +08:00
同意 2L 的说法 这里直接 建立 Name ASC, Age ASC 的索引然后 Include Phone 其实是最好的 MySQL 没有 include 的话就 name, age, phone 好了
dog82
2022-12-01 18:07:26 +08:00
不一定能利用 columnA 得索引,因为查询计划都是基于 CBO 的
查询优化有点玄学,受各种条件影响,但是底层的原理摸清楚后,就不会问这种问题了
victorc
2022-12-01 23:51:34 +08:00
你 explain 看看结果,目测会有 file sort ,也就是用不到 columnA 的索引

你这种情况应该创建 name_age 的联合索引,这个 query 排序就可以利用索引了

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

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

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

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

© 2021 V2EX