内嵌查询 用覆盖索引+limit ,explain 的type是index,扫描行树非常大。
作为一个单独的查询语句,扫描行数就只扫描 limit 限制的条数。
嵌套查询
EXPLAIN SELECT
*
FROM
( SELECT id, db_id, warehouse_id, updated_at FROM salesorderskus ORDER BY db_id, warehouse_id, item_id LIMIT 20 ) t
INNER JOIN salesorderskus ON t.id = salesorderskus.id
AND t.db_id = salesorderskus.db_id
独立的查询语句
explain SELECT
id,
db_id,
warehouse_id,
updated_at
FROM
salesorderskus
ORDER BY
db_id,
warehouse_id,
item_id
LIMIT 20
首先看那个子查询的explain,可以看到有三个,我们只是看到大部分都相同所以认为第三个的解析是下面单个查询的解析,但是并不是,因为用的是子查询,所以对应的应该是第一个才对,table是一个缓存表(mysql子查询的时候会创建一个缓存表),那为什么第三个会有那么多匹配行数呢,是因为inner join的原因,他应该会遍历整表,然后去匹配,所以造成匹配行数那么多。