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