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 行?
1
ywlvs 2021-08-03 15:34:37 +08:00
你用 10 / 292,不就是 3.42% 嘛
|
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 排序 |