mysql 从left join 到join到查询计划到联合索引的原理

 

left join

left join在无脑使用中,会大表驱动小表,触发笛卡尔集,效率慢

join会自动小表驱动大表

参考:

从一个MySQL left join优化的例子加深对查询计划的理解 
http://luxuryzh.iteye.com/blog/1976004

类似优化sql的美团一个文章,他用的是union,感觉也可以用join

select
         emp.id as emp_id,
         emp_cert.id as cert_id 
      from
         employee emp 
      left join
         emp_certificate emp_cert 
            on emp.id = emp_cert.emp_id 
      where
         emp.is_deleted=0

 

相关的explain查询计划解释

 

type分为system/const/eq_ref/ref/range/index/ALL等好几类,连接的效率从前往后 
好。。》 差

all:木有用到索引 

index,用到

range,索引的between in等范围类

ref 非主键索引

const 主键索引

参考:

MySQL执行计划解读 - ggjucheng - 博客园
http://www.cnblogs.com/ggjucheng/archive/2012/11/11/2765237.html

联合索引原理

假设 a为1,2,3,b也为1,2,3

把a,b设为联合索引

则在树中排序方式为(a,b)->

1 1, 1 2, 1 3,

2 1, 2 2 ,2 3,

3 1, 3 2 ,3 3

只看a, a是有序的,而b不是

所以在查询中,如果两者在where中都用到了,则不分先后,mysql都会自动用索引,

如果where中只用了a,也是可以的,因为a有顺序

如果只用到了b,则查询计划中type为all,即无索引使用。

前缀索引

刚才是的二个,如果增加3个,a,b ,c 

那么使用

a b c

a c

a b

即除了a以外,只要有a,无关顺序,都可以,mysql version:5.7

type都是ref, 非主键索引

例子在

mysql索引使用技巧及注意事项 - 夏雪冬日 - 博客园
https://www.cnblogs.com/heyonggang/p/6610526.html

其它参考:

MySQL InnoDB联合索引学习 – 运维那点事
http://www.ywnds.com/?p=11204

 

 

转载于:https://www.cnblogs.com/stevenlii/p/8609900.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值