in和exists的取舍
之前说过要小表驱动大表,即先遍历小表再遍历大表,接下来看一下in和exists的区别
in
先执行子查询,适合于外表大而内表小的情况
select * from A where id in (select id from B)
等价于==
先遍历表B select id from B
再遍历表A select * from A where A.id = B.id
in的参数是子查询时,会将子查询结果存储在一张临时的表中(内联视图),然后扫描整个视图
exists
以外层表作为驱动表,外层表先被访问,适合于外表大而内表小的情况
select * from A where id exists (select 1 from A.id = B.id)
等价于
先遍历表A select * from A
再遍历表B select * from B where A.id = B.id
将主查询数据放到子查询中做验证,根据验证结果来确定主查询结果的去留
使用exists数据库不会生成临时的表
结论
根据执行顺序也就得知了什么时候该用in什么时候该用exists了
即 子查询数据量大的时候用exists
https://zhhll.icu/2021/数据库/关系型数据库/MySQL/进阶/7.in和exists的取舍/文章来源:https://www.toymoban.com/news/detail-818626.html
本文由 mdnice 多平台发布文章来源地址https://www.toymoban.com/news/detail-818626.html
到了这里,关于MySQL in和exists的取舍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!