mysql索引优化实际例子_MySQL索引优化(索引三表优化案例)

建表SQL

73782b8b0b794964d025d3f0e0e8e502.png

775e295c7ebef394a2b7ae04af879474.png

4062ea0b4b708d15c3233b37142afee4.png

a4dad340e7a1b7f93bc84a0e4156e1cb.png

ed4877f1b12b3bce82738cf8a4045dd8.png

2cc127ead975dd4e579299665c1af6f5.png

5a19e5222a22e89f12204366f8b771a3.png

phone、book表建立索引

bbab3a589ef55bda36d0c0e365ccc5b2.png

4529cefed267c553a5bf0c11e1cfe2ff.png

b2c2cd1e62fc1e978ccff47005214e27.png

5b70917ab169edcefb05b9b38ceac247.png

【关联优化查询建议】

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);

b05b80d87efd947fb719d374c557ad12.png

有索引小驱动大表 性能优于 大表驱动小表

无索引 小表驱动大表

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);

ffd12c39f3ca92ff425c80f032672d40.png

01035cfa597aa8725b5021da62357204.png

60f3586bac35dd6033e22c90f3678e03.png

无索引大表驱动小表

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;

5a8a5ee52b789983e5d4363897693e06.png

4b73179276554f37e24e351b9fc25d26.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值