假设有一个职位表v_jobs,使用该职位下的各种业务存在v_jobservice表,想要知道不同状态的职位对应发布了多少业务,每个职位可以不只一个发布业务。
数据库中,v_jobs有 46,0288 条数据,v_jobservice有 207,3082 条数据。
1 使用In
SELECT status, count(status) AS num FROM v_Jobs WHERE jobid IN (SELECT jobid FROM v_jobservice) GROUP BY status
2 使用Exist
SELECT status, count(status) AS num FROM v_Jobs a WHERE EXISTS (SELECT 1 FROM v_jobservice where jobid=a.jobid ) GROUP BY status
可以看出,In耗时11.6s,Exist耗时9.8s,相对快些。
这是因为In先执行子查询并把结果作为条件传给外层,而Exist先执行外层查询并缓存结果集,遍历每一行带入子查询作为条件,子查询有结果则返回True。副表数据量大的情况下,Exist效率更高。