多个left join优化

tables:

  • employee

  • employee_orgn:联合主键(employee_id,orgn_id),索引1:employee_id,索引2:orgn_id

  • orgn

sql:

explain SELECT DISTINCT
    e.*FROM
    employee e
        LEFT JOIN
    employee_orgn eo ON eo.employee_id = e.id        LEFT JOIN
    orgn o ON o.id = eo.orgn_idWHERE
    e.state != 'deleted'
        AND e.state != 'hidden'
        AND (o.state != 'hidden' OR o.state IS NULL)ORDER BY e.id DESC

explain:


https://img1.mukewang.com/5b65a08e00012bbd08000238.jpg

Q:

  1. 这里join联查,mysql嵌套循环查询了10的8次方的数量级吗?

  2. 为什么有临时表,和排序为什么是文件排序

  3. 为什么第二行是覆盖索引

  4. 希望讲解一下这个explain结果,优化分析

感激不尽呀~


隔江千里
浏览 1672回答 1
1回答

炎炎设计

1、注意看数字8的表头key_len,说的是使用索引字段的长度。2、Using tempory, Using filesort是受order by语句的影响,你可以去掉order by再看一下执行计划。3、eo表使用覆盖索引是合理的,因为索引已经包含了查询所需的所有数据。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java