专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

「Oracle」in与exists,你站哪一边

ins518 2024-10-25 14:21:42 技术文章 6 ℃ 0 评论

说来惭愧,小编一直以为EXISTS的效率会高,直到今天,小编才知道自己错了。

今天,生产报来了个问题,有个功能菜单查询好慢,小编立马翻出SQL一看,o(︶︿︶)o 唉,没问题啊,然后想起用了mybatis的PageHelper,然后COUNT了一下SQL,不COUNT不知道,一COUNT吓一跳,这一SQL花费了十几秒,我的天啊。然后排查问题,到了这一个EXISTS语句,去掉后,SQL查询速度飞快,小编抓了抓头,把这个匹配条件改为了IN,执行,速度也飞快。这让当时的小编怀疑了下人生,下班回来查了下百度。

据说,IN与EXISTS没有谁效率高这一说法,谁快谁慢,得看实际的应用场景,且看下面两条sql:

SELECT * FROM A WHERE A.ID IN (SELECT B.ID FROM B);

SELECT * FROM A WHERE EXISTS (SELECT 1 FROM B WHERE A.ID = B.ID);

这两个情况在数据量少的时候,耗时基本没有出入。

  • 第一种情况呢,表B的数据量少的话,查询速度会很快,使用的是表A的索引;
  • 第二种情况呢,正好相反,表A的数据量少,查询速度会很快,使用的是表B的索引。

所以,小编根据这样的理解,分为了7个场景:

  1. 表A数据量少时,使用EXISTS;
  2. 表B数据量少时,使用IN;
  3. 表A与表B数据量相仿时,表A有索引时使用IN;
  4. 表A与表B数据量相仿时,表B有索引时使用EXISTS;
  5. 表A与表B数据量都少时,随便用;
  6. 表A与表B都有索引时,随便用;
  7. 表A与表B都没索引时,且数据量大时,且行且珍惜吧。

理解比较肤浅,有更好的解答或哪里错了的话,欢迎为小编指正,小编在此谢过。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表