SQL执行顺序

有两张表,大小差不多,都有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;
  1. 对于case_info表,走的索引是create_date,走这个的原因是order by 这样就可以不用排序了;
  2. 从create_date 索引树上找最大的一条数据,然后到case_info表回表,看type=6,is_del=0 是否满足,如果不满足就接着在从create_date索引树上取下一条数据;
  3. 如果满足的话,因为circle表对case_id加了索引,所以这个join关联查询是走索引的,就会去circle的case_id索引树上找到circle的主键id,然后再去回表,匹配 circle.is_del=0 是否满足;
  4. 如果满足的话,把info.id放入临时表;
  5. 循环上述步骤,最后对临时表的info.id去重,再取前10条数据(MySQL版本5.5).

执行计划(公司数据 所以一些关键字我给打码了)
image.png

之所以distinct(info.id)是因为 case_info表和circle表是1对多的关系,如果不去重,最后返回的结果有重复的id。
阅读 1.7k
1 个回答

第二步就错了吧,回表排序不是在后面吗?怎么一开始就找最大值?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题