假设表tableX
有 id
(primary key) name
,age
, phone
, 都有索引
如果这样查询: select phone from tableX where name='Dennis' order by age
这个过程应该是
name
index 找到所有符合 Dennis 的 id ,记为集合 Setage
index 给集合 Set 排序phone
但第二步是怎么实现的呢?
我觉得有一种可能是直接在 age 的索引 b+树里面顺序扫描,看扫描到的 id 是不是在 Set 里面,如果是就加入到一个列表。那么这个列表里面就是按照 age 排序号的 id
但这样和顺序扫描有什么区别吗?为什么要用索引呢?
1
lambdaq 2022-12-01 11:29:39 +08:00
为什么 Java 父类构造函数调用被重写的方法会调用到子类的
mysql 里面会自动为没有主键的表创建聚簇索引吗? mysql 里面 order by columnA 为什么能利用 columnA 的索引 SpringSecurity 前后端分离的情况下,如何防止 CSRF 攻击? 好家伙。v2ex 大学码农培训学校毕业。。。。 |
2
optional 2022-12-01 11:30:04 +08:00 via iPhone
你说的 123 不会同时实现的,要么用 name index 筛选再排序,要么用 age index 按顺序扫描,过滤记录。
|
3
fgwmlhdkkkw 2022-12-01 14:29:23 +08:00 2
@lambdaq #1 惹人厌
|
4
zhzy0077 2022-12-01 17:47:49 +08:00
同意 2L 的说法 这里直接 建立 Name ASC, Age ASC 的索引然后 Include Phone 其实是最好的 MySQL 没有 include 的话就 name, age, phone 好了
|
5
dog82 2022-12-01 18:07:26 +08:00
不一定能利用 columnA 得索引,因为查询计划都是基于 CBO 的
查询优化有点玄学,受各种条件影响,但是底层的原理摸清楚后,就不会问这种问题了 |
6
victorc 2022-12-01 23:51:34 +08:00
你 explain 看看结果,目测会有 file sort ,也就是用不到 columnA 的索引
你这种情况应该创建 name_age 的联合索引,这个 query 排序就可以利用索引了 |