为什么 子查询用 覆盖索引+limit 扫描行数非常大。

内嵌查询 用覆盖索引+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的原因,他应该会遍历整表,然后去匹配,所以造成匹配行数那么多。