有两张表,大小差不多,都有300万多的数据,case_info表对type和create_date都加了索引,circle表对case_id加了索引,下面的SQL在生产环境查询需要6秒多。
我想请问的是,这句SQL的执行顺序是怎么样的(下面步骤是我的猜想,不知道对不对)?
EXPLAIN SELECT distinct(info.id)
FROM
case_info info STRAIGHT_JOIN
order_circle circle on info.id = circle.case_id
WHERE
info.type=6
and circle.is_del=0
and info.is_del=0
ORDER BY info.create_date DESC
LIMIT 0,10;
- 对于case_info表,走的索引是create_date,走这个的原因是order by 这样就可以不用排序了;
- 从create_date 索引树上找最大的一条数据,然后到case_info表回表,看type=6,is_del=0 是否满足,如果不满足就接着在从create_date索引树上取下一条数据;
- 如果满足的话,因为circle表对case_id加了索引,所以这个join关联查询是走索引的,就会去circle的case_id索引树上找到circle的主键id,然后再去回表,匹配 circle.is_del=0 是否满足;
- 如果满足的话,把info.id放入临时表;
- 循环上述步骤,最后对临时表的info.id去重,再取前10条数据(MySQL版本5.5).
执行计划(公司数据 所以一些关键字我给打码了)
之所以distinct(info.id)是因为 case_info表和circle表是1对多的关系,如果不去重,最后返回的结果有重复的id。
第二步就错了吧,回表排序不是在后面吗?怎么一开始就找最大值?