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

mysql 优化 filtered 和 rows 问题

  •  
  •   kikione · 2021-08-03 13:59:18 +08:00 · 982 次点击
    这是一个创建于 994 天前的主题,其中的信息可能已经有所发展或是发生改变。

    EXPLAIN SELECT * FROM t_request

    WHERE merchant_id = 1507 ORDER BY id DESC LIMIT 10

    merchant_id 有普通索引

    1 SIMPLE requesttra0_ index idx_merchantid_status_createtime_amount PRIMARY 4 292 3.42 Using where

    这张表 700W,麻烦帮我解释一下这个 sql 执行过程, 是否扫描了索引树? 为什么 rows 是 292 filtered 是 3.42 , mysql 执行语句是查了 所有行,还是只查了前 10 行?

    2 条回复    2021-08-05 17:42:24 +08:00
    ywlvs
        1
    ywlvs  
       2021-08-03 15:34:37 +08:00
    你用 10 / 292,不就是 3.42% 嘛
    zydxn
        2
    zydxn  
       2021-08-05 17:42:24 +08:00
    merchant_id 有索引会走

    Extra 没有 Using filesort,应该没用 sort_buffer 排序

    Extra 没有 Using idnex,因为 SELECT *,应该需要回表拿数据

    Extra 有 Using where,说明存储引擎返回的数据不全满足查询条件,在 server 层进行了过滤

    从 explain 结果看应该是返回 292 行数据到 server,然后排序后取 10 条返回 client

    我猜因为按照 id 排序,所以执行计划是在 server 层排序,而没用 sort_buffer 或者 rowid 排序
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1036 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:27 · PVG 06:27 · LAX 15:27 · JFK 18:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.