mysql 优化 filtered 和 rows 问题

2021-08-03 13:59:18 +08:00
 kikione

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 行?

991 次点击
所在节点    程序员
2 条回复
ywlvs
2021-08-03 15:34:37 +08:00
你用 10 / 292,不就是 3.42% 嘛
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 排序

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/793375

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX