鍍金池/ 問答/Java  數(shù)據(jù)庫/ 多個(gè)left join優(yōu)化

多個(gè)left join優(yōu)化

tables:

  • employee
  • employee_orgn:聯(lián)合主鍵(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_id
WHERE
    e.state != 'deleted'
        AND e.state != 'hidden'
        AND (o.state != 'hidden' OR o.state IS NULL)
ORDER BY e.id DESC

explain:

clipboard.png

Q:

  1. 這里join聯(lián)查,mysql嵌套循環(huán)查詢了10的8次方的數(shù)量級(jí)嗎?
  2. 為什么有臨時(shí)表,和排序?yàn)槭裁词俏募判?/li>
  3. 為什么第二行是覆蓋索引
  4. 希望講解一下這個(gè)explain結(jié)果,優(yōu)化分析

感激不盡呀~

回答
編輯回答
情未了

1、注意看數(shù)字8的表頭key_len,說的是使用索引字段的長度。
2、Using tempory, Using filesort是受order by語句的影響,你可以去掉order by再看一下執(zhí)行計(jì)劃。
3、eo表使用覆蓋索引是合理的,因?yàn)樗饕呀?jīng)包含了查詢所需的所有數(shù)據(jù)。

2017年8月6日 09:31