not exists、not in对比

not exists、not in对比

MySQL数据库中有两张表,表A含有518000条数据,B表含有10条数据。

实验

一、用较小的表做子查询

  • not exists 语句查询用时大概 50s
SELECT * FROM A WHERE NOT exists ( SELECT B.b_id FROM B where B.b_id =A.a_id ) 
  • not in 语句查询用时大概 7s
SELECT * FROM A WHERE a_id NOT in ( SELECT B.b_id FROM B ) 
  • exists 语句查询用时大概51.13s
SELECT * FROM A WHERE exists ( SELECT B.b_id FROM B where B.b_id =A.a_id )
  • in 语句查询用时大概2.922s
SELECT * FROM A WHERE a_id in ( SELECT B.b_id FROM B )

二、用较大的表做子查询

  • not exists 语句查询用时大概2s
SELECT * FROM B WHERE NOT exists ( SELECT A.a_id FROM A where B.b_id =A.a_id )
  • not in 时间: 12s
SELECT * FROM B WHERE b_id NOT in ( SELECT A.a_id FROM A ) 
  • exists 语句查询用时大概0.008s
SELECT * FROM B WHERE exists ( SELECT A.a_id FROM A where B.b_id =A.a_id )
  • in 语句查询用时大概10.759s
SELECT * FROM B WHERE b_id in ( SELECT A.a_id FROM A )

结论

以上数据是在同一台服务器上,在相同环境下操作得到的结果,从中大致可以得到这样的结论:

  • 当大数据量的表做主表查询,小数据量的表做子查询时,用in的效率比较高,exists的效率比较低;反正则exists的效率比较高,in的效率比较低。
  • 还有一点需要注意的就是,在使用in的时候,如果子查询的结果含有null,将查询不到数据,所以在子查询时要做好非空判断。

你可能感兴趣的:(数据库相关)