V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
littlemoney
V2EX  ›  问与答

MySQL 索引的疑问

  •  1
     
  •   littlemoney · 2019-11-20 23:02:07 +08:00 · 1350 次点击
    这是一个创建于 1840 天前的主题,其中的信息可能已经有所发展或是发生改变。
    菜鸟有个疑问,你执行一条 sql,比如说是根据日期 between and,日期上加了索引,你用 explain 的时候,sql 明明还没执行,可是结果中的 rows 却已经列出了需要扫描的行,这个行,mysql 是怎么推断出的呢?
    8 条回复    2019-11-21 10:20:36 +08:00
    msg7086
        1
    msg7086  
       2019-11-21 01:39:11 +08:00
    通过索引?
    binux
        2
    binux  
       2019-11-21 01:41:26 +08:00
    plan 啊,mysql 需要知道要扫描多少行,才能决定是用索引还是干脆就直接 scan 快。
    ra1983
        3
    ra1983  
       2019-11-21 01:45:04 +08:00 via Android
    通过 statistics
    littlemoney
        4
    littlemoney  
    OP
       2019-11-21 09:32:31 +08:00 via Android
    @binux 可能我表述的不清楚,我的疑问是,mysql 是怎么再执行前就能预判出要扫描多少行的呢?因为我发现,如果你 range 索引的区间选定的很大,超过全表数据 40%的阈值时?(这个可能不准确,不过我试下来的确有这个阈值在),这个时候哪怕你加了索引,它也不会走索引,会全表扫描,我的疑问就在这里,它通过什么手段,在执行前能估计出要扫描的行数呢
    richard1122
        5
    richard1122  
       2019-11-21 09:50:22 +08:00
    优化器会在多个执行计划里做出选择,你也可以手动进行 hint。

    参考官方文档: https://dev.mysql.com/doc/refman/5.7/en/cost-model.html
    richard1122
        6
    richard1122  
       2019-11-21 09:51:42 +08:00
    https://dev.mysql.com/doc/internals/en/optimizer-tracing.html

    也可以开启 tracer,可以看到非常具体的执行计划的评估
    littlemoney
        7
    littlemoney  
    OP
       2019-11-21 10:02:30 +08:00
    @richard1122 嗯嗯,好的,谢谢大佬,我瞧瞧
    xh520630
        8
    xh520630  
       2019-11-21 10:20:36 +08:00
    会计算使用索引和不使用索引的消耗然后取个小的
    有个啥方法通过前多少条有多少命中索引的推测全表有多少条数据符合条件然后计算
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1261 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:32 · PVG 07:32 · LAX 15:32 · JFK 18:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.