V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
movq
V2EX  ›  程序员

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

  •  
  •   movq · 2022-12-01 11:24:09 +08:00 · 975 次点击
    这是一个创建于 704 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设表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

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

    6 条回复    2022-12-01 23:51:34 +08:00
    lambdaq
        1
    lambdaq  
       2022-12-01 11:29:39 +08:00
    为什么 Java 父类构造函数调用被重写的方法会调用到子类的

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

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

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


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

    你这种情况应该创建 name_age 的联合索引,这个 query 排序就可以利用索引了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   955 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 21:47 · PVG 05:47 · LAX 13:47 · JFK 16:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.