正在加载中,请稍后

MySQL查询优化之小表驱动大表

MySQL查询优化之小表驱动大表

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

     }
}

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

    }
}

小表驱动大表的原理就像是两个嵌套的for循环,上面例子虽然总的循环次数是相同的,但是在MySQL查询的时候,就不一样了。我们会趋向于使用第二种循环方式,也就是小表驱动大表,而不是大表驱动小表。

为什么呢?

数据库最伤神的就是跟程序链接释放,第一个建立了10000次链接,第二个建立了50次。假设链接了两次,每次做上百万次的数据集查询,查完就走,这样就只做了两次;相反建立了上百万次链接,申请链接释放反复重复,这样系统就受不了了。

in和exists对比

select * from A where id in (select id from B)
等价于:
for select id from B 
for select * from A where A.id = B.id

当B的数据集小于A的数据集时,用 in 优于exists

select * from A where exists (select 1 from B where B.id = A.id)
等价于:
for select * from A
for select * from B where B.id=A.id

当A的数据集小于B表的数据集时,用exists 优于in

注意:A表与B表的id字段应该建立索引。

总结:

下面结论都是针对in或exists的。

in后面跟的是小表,exists后面跟的是大表。

简记:in小,exists大。

对于exists

select .....from table where exists(subquery);

可以理解为:将主查询的数据放入子查询中做条件验证,根据验证结果(true或false)来决定主查询的数据是否得以保留

posted @ 2021-06-24 16:19  wode虎纹猫  阅读(1945)  评论(0)    收藏  举报
Live2D