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

面试的时候被问, mysql 在执行 sql 的时候是如何选择使用哪个索引的?

  •  
  •   clifftts · 2019-06-10 13:14:08 +08:00 · 2759 次点击
    这是一个创建于 1997 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大家觉得这个问题有没有毛病?我看过一些 mysql 的数据,但是涉及 sql 解析器,优化器的部分感觉都很理论且笼统,对于 mysql 是如何选择出索引的问题上确实没有思路。大家分析分析这个题
    第 1 条附言  ·  2019-06-10 15:06:32 +08:00
    在不考虑临时表和排序的情况下,优化器的目的是通过选择合适索引找到扫描数据行数最少的方案。
    扫描行多少涉及到索引“基数”,mysql 采样统计“基数”,采样的数据不够精准,导致最终选出的方案在优化器看来最优,但实际执行起来并不是最优。
    所以可以理解为 mysql 优化器最终选择哪个索引,需要具体采样数据来决定的,我们并不能看出来或者算出来。
    我觉得这道题隐藏的考察点可能是如何让 mysql 每次都能选择我们为某个 sql 所设计的最优索引,而不会因为优化器选择其他索引导致性能问题,
    通过 force index 指定索引。
    8 条回复    2019-06-10 17:31:06 +08:00
    acehow
        1
    acehow  
       2019-06-10 14:44:30 +08:00 via Android   ❤️ 1
    explain
    snappyone
        2
    snappyone  
       2019-06-10 14:45:52 +08:00
    数据抽样做预测
    wuxi889
        3
    wuxi889  
       2019-06-10 14:49:18 +08:00
    感觉是考你每种索引的特点吧
    clifftts
        4
    clifftts  
    OP
       2019-06-10 15:09:20 +08:00
    @wuxi889 考察每种索引的特点,应该问如何针为 sql 设计一个最优索引吧
    clifftts
        5
    clifftts  
    OP
       2019-06-10 15:09:51 +08:00
    @snappyone 老哥稳,比较接近了
    snappyone
        6
    snappyone  
       2019-06-10 15:19:12 +08:00
    @clifftts force index 本身侵入性太强了,可以考虑低峰期 analyze 下 table
    liprais
        7
    liprais  
       2019-06-10 15:30:36 +08:00 via iPad
    mysql 连直方图都没有基数估计跟算命差不多准
    Raymon111111
        8
    Raymon111111  
       2019-06-10 17:31:06 +08:00
    简单讲是通过算 cost

    会选 cost 小的那个

    换句话说会选区分度大的那个
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1397 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:47 · PVG 07:47 · LAX 15:47 · JFK 18:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.