本文主要是介绍五年经验,还不懂小表驱动大表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
小表驱动大表,也就是说用小表的数据集驱动大表的数据集。假如有order和user两张表,其中order表有10000条数据,而user表有100条数据。
这时如果想查一下,所有有效的用户下过的订单列表。可以使用in
关键字实现:
select * from order
where user_id in (select id from user where status=1)
也可以使用exists
关键字实现:
select * from order
where exists (select 1 from user where order.user_id = user.id and status=1)
前面提到的这种业务场景,使用in关键字去实现业务需求,更加合适。为什么呢?因为如果sql语句中包含了in关键字,则它会优先执行in里面的子查询语句
,然后再执行in外面的语句。如果in里面的数据量很少,作为条件查询速度更快。
而如果sql语句中包含了exists关键字,它优先执行exists左边的语句(即主查询语句)。然后把它作为条件,去跟右边的语句匹配。如果匹配上,则可以查询出数据。如果匹配不上,数据就被过滤掉了。这个需求中,order表有10000条数据,而user表有100条数据。order表是大表,user表是小表。如果order表在左边,则用in关键字性能更好。
总结一下:
in
适用于左边大表,右边小表。exists
适用于左边小表,右边大表。
不管是用in,还是exists关键字,其核心思想都是用小表驱动大表。
这篇关于五年经验,还不懂小表驱动大表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!