Mysql优化原则_小表驱动大表IN和EXISTS的合理利用

//假设一个for循环
for($i = 0; $i < 10000; $i++) 
{
     for ($j = 0; $i < 50; $j++)
     {

     }
}

for($i = 0; $i < 50; $i++) 
{
    for ($j = 0; $i < 10000; $j++)
    {

    }
}

看以上两个for循环,总共循环的次数是同样的。可是对于mysql数据库而言,并非这样了,咱们尽可能选择第②个for循环,也就是小表驱动大表。
数据库最伤神的就是跟程序连接释放,第一个创建了10000次连接,第二个创建了50次。假设连接了两次,每次作上百万次的数据集查询,查完就走,这样就只作了两次;相反创建了上百万次连接,申请连接释放反复重复,这样系统就受不了了。
这时候就诞生了in 和exists的对比。mysql

小表驱动大表:即小的数据集驱动大的数据集。sql

这里假设A表表明员工表,B表表明部门表。
假设部门只有三个,销售、技术部、行政部,言下之意是在这三个部门里的全部员工都查出。数据库

select * from A where id in (select id from B);

这样写就等价于:
for select id from B。好比华为有100个部门,可是华为的员工少说有15W-20W,员工总比部门多,这时候就至关于获得了小表(部门表);for select * from A where A.id = B.id,至关于A.id等B表里面的,至关于从部门表得到对应的id。优化

当B表的数据集必须小于A表的数据集时,用in优于exists。
反之code

select * from A where exists (select 1 from B where B.id = A.id); //这里的select 1并不绝对,能够写为select 'X'或者'A','B','C'均可以,只要是常量就能够。

这样写就等价于:
for select * from A,先从A表作循环
for select * from B where B.id = A.id,再从B表作循环。
这样exists就会变成看看A表是否存在于(select 1 from B where B.id = A.id)里面,这个查询返回的是TRUE或者FALSE的BOOL值,简单来讲就是要当A表的数据集小于B表的数据集时,用exists优于in。要注意的是:A表与B表的ID字段应该创建索引。索引

语法:EXISTSfor循环

SELECT ...FROM table WHERE EXISTS(subquery)。
理解:将主查询的数据放到子查询中作条件验证,根据验证结果(TRUE或者FALSE)来决定朱查询的数据结果是否得意保留。
至关于从表A和B中取出交集,而后再从A表中取出所在交集的部分数据,固然后面加WHERE条件还能够进一步筛选。table

补充效率

1:EXISTS(subquery)只返回TRUE或者FALSE,所以子查询中的SELECT * 也能够是SELECT 1或者SELECT 'X',官方说法是实际执行时会忽略SELECT清单,所以没有区别。
2:EXISTS子查询的实际执行过程可能通过了优化而不是咱们理解上的逐条对比,若是担心效率问题,可进行实际校验。
3:EXISTS子查询旺旺能够用条件表达式,其余子查询或者JOIN来替代,何种最优须要具体问题具体分析。select

若是查询的两个表大小至关,那么用in和exists差异不大。

延伸举例巩固

若是两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表A(小表),表B(大表)

select * from A where cc in (select cc from B) ;//  效率低,用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=A.cc) ;// 效率高,用到了B表上cc列的索引。

相反

select * from B where cc in (select cc from A) ; //效率高,用到了B表上cc列的索引;
select * from B where exists(select cc from A where cc=B.cc) ;//效率低,用到了A表上cc列的索引。

not in 和not exists若是查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。因此不管那个表大,用not exists都比not in要快。

相关文章
相关标签/搜索