MySQL索引優化(索引三表優化案例)

2021-09-26 08:35:32 字數 2823 閱讀 1299

建表sql

phone、book表建立索引

1、保證被驅動表的join欄位已經被索引

被驅動表  join 後的表為被驅動表  (需要被查詢)

2、left join 時,選擇小表作為驅動表,大表作為被驅動表。

但是 left join 時一定是左邊是驅動表,右邊是被驅動表

3、inner join 時,mysql會自己幫你把小結果集的表選為驅動表。

mysql 自動選擇。小表作為驅動表。因為 驅動表無論如何都會被全表掃瞄?。所以掃瞄次數越少越好。

4、子查詢盡量不要放在被驅動表,有可能使用不到索引。

select a.name ,bc.name from t_emp a left join

(select b.id , c.name from t_dept b

inner join t_emp c on b.ceo = c.id)bc

on bc.id = a.deptid.

上段查詢中用到了子查詢,必然 bc 表沒有索引。肯定會進行全表掃瞄

上段查詢 可以直接使用 兩個 left join 優化

select a.name , c.name from t_emp a

left outer join t_dept b on a.deptid = b.id

left outer join t_emp c on b.ceo=c.id

所有條件都可以使用到索引

若必須用到子查詢,可將子查詢設定為驅動表,,因為驅動表的type 肯定是 all,而子查詢返回的結果表沒有索引,必定也是all

用in 還是 exists

1、實驗

有索引 小表驅動大表

select sql_no_cache sum(e.sal) from (select * from emp where id

<

10000

) e where exists (select 1 from emp where e.deptno

=emp.deptno);

select sql_no_cache sum(e.sal) from (select * from emp where id<10000) e inner join (select distinct deptno from emp) m on m.deptno

=e.deptno;

select sql_no_cache sum(sal) from emp where deptno in (select deptno from dept);

有索引小驅動大表 效能優於 大表驅動小表

無索引 小表驅動大表

select sql_no_cache sum(e.sal) from (select * from emp where id

<

10000

) e where exists (select 1 from emp where e.deptno

=emp.deptno);

select sql_no_cache sum(e.sal) from (select * from emp where id<10000) e inner join (select distinct deptno from emp) m on m.deptno

=e.deptno;

select sql_no_cache sum(sal) from emp where deptno in (select deptno from dept);

無索引大表驅動小表

select sql_no_cache sum(sal) from emp where deptno in (select deptno from dept);

select sql_no_cache sum(sal) from emp where exists (select 1 from dept where emp.deptno=dept.deptno);

select sql_no_cache sum(sal) from emp inner join dept on emp.deptno=dept.deptno;

MySQL索引優化(索引三表優化案例)

建表sql phone book表建立索引 1 保證被驅動表的join欄位已經被索引 被驅動表 join 後的表為被驅動表 需要被查詢 2 left join 時,選擇小表作為驅動表,大表作為被驅動表。但是 left join 時一定是左邊是驅動表,右邊是被驅動表 3 inner join 時,my...

MySQL優化索引之三表優化

建表sql create table if not exists phone phoneid int 10 unsigned not null primary key auto increment,card int 10 unsigned not null engine innodb insert ...

MySQL索引優化(索引單錶優化案例)

1 單錶查詢優化 建表sql 案例 查詢 category id 為1 且 comments 大於 1 的情況下,views 最多的 article id。執行sql 結論 很顯然,type 是 all,即最壞的情況。extra 裡還出現了 using filesort,也是最壞的情況。優化是必須的...