当前位置: 首页 > 面试题库 >

EXISTS与IN的子查询-MySQL

卜泓
2023-03-14
问题内容

以下两个查询是子查询。两者相同,都对我有效。但是问题是方法1的查询大约需要10秒才能执行,而html" target="_blank">方法2的查询不到1秒。

我能够将方法1的查询转换为方法2,但是我不了解查询中正在发生什么。我一直想自己弄清楚。我真的很想了解以下两个查询之间的区别是什么,以及如何获得性能提升?它背后的逻辑是什么?

我是这些高级技术的新手。我希望有人能在这里帮助我。考虑到我阅读的文档并没有给我任何提示。

方法1:

SELECT
   *       
FROM
   tracker       
WHERE
   reservation_id IN (
      SELECT
         reservation_id                                 
      FROM
         tracker                                 
      GROUP  BY
         reservation_id                                 
      HAVING
         (
            method = 1                                          
            AND type = 0                                          
            AND Count(*) > 1 
         )                                         
         OR (
            method = 1                                              
            AND type = 1                                              
            AND Count(*) > 1 
         )                                         
         OR (
            method = 2                                              
            AND type = 2                                              
            AND Count(*) > 0 
         )                                         
         OR (
            method = 3                                              
            AND type = 0                                              
            AND Count(*) > 0 
         )                                         
         OR (
            method = 3                                              
            AND type = 1                                              
            AND Count(*) > 1 
         )                                         
         OR (
            method = 3                                              
            AND type = 3                                              
            AND Count(*) > 0 
         )
   )

方法2:

SELECT
   *                                
FROM
   `tracker` t                                
WHERE
   EXISTS (
      SELECT
         reservation_id                                              
      FROM
         `tracker` t3                                              
      WHERE
         t3.reservation_id = t.reservation_id                                              
      GROUP BY
         reservation_id                                              
      HAVING
         (
            METHOD = 1 
            AND TYPE = 0 
            AND COUNT(*) > 1
         ) 
         OR                                                     
         (
            METHOD = 1 
            AND TYPE = 1 
            AND COUNT(*) > 1
         ) 
         OR                                                    
         (
            METHOD = 2 
            AND TYPE = 2 
            AND COUNT(*) > 0
         ) 
         OR                                                     
         (
            METHOD = 3 
            AND TYPE = 0 
            AND COUNT(*) > 0
         ) 
         OR                                                     
         (
            METHOD = 3 
            AND TYPE = 1 
            AND COUNT(*) > 1
         ) 
         OR                                                     
         (
            METHOD = 3 
            AND TYPE = 3 
            AND COUNT(*) > 0
         )                                             
   )

问题答案:

An Explain Plan 会告诉您为什么要使用Exists。通常问题来了Exists vs Count(*)
Exists是比较快的。为什么?

  • 关于NULL带来的挑战:当 子查询返回时Null,对于IN,整个查询变为Null。因此,您也需要处理。但是使用Exist,它只是一个false。轻松应对。根本IN无法与之相比,Null但是Exists可以。

  • 例如,Exists (Select * from yourtable where bla = 'blabla');一旦 找到/匹配匹配项, 您就会得到true / false 。

  • 在这种情况下,INsort会根据的位置Count(*)选择 所有 匹配的行,WHERE因为它正在比较所有值。

但也不要忘记这一点:

  • EXISTS``IN当子查询结果非常大时,针对:高速执行。
  • IN领先于EXISTS:子查询结果非常小时。

参考以获取更多详细信息:

  • 使用IN的子查询。
  • IN-子查询优化
  • 加入与子查询。


 类似资料:
  • 本文向大家介绍mySQL中in查询与exists查询的区别小结,包括了mySQL中in查询与exists查询的区别小结的使用技巧和注意事项,需要的朋友参考一下 一、关于exists查询 以上是一个典型的exists查询的sql语句。 它的作用方式是这样的:每次从vendor表中查询出一条数据,然后将这条数据中的vendor_prov_code值传递到exists查询中进行执行,也就是进行子查询的执

  • 问题内容: 我很好奇为何应该比更快地执行。 当比尔·卡尔文提出一个要点时,我正在回答一个问题。当您使用它时,它使用相关子查询(依赖子查询),而IN()仅使用子查询。 解释显示,并且两者都使用了一个依赖子查询,并且都只使用了一个子查询..所以我很好奇关联子查询如何比子查询更快? 我以前使用过EXISTS,它的执行速度比IN快,这就是我感到困惑的原因。 这是带有说明的SQLFIDDLE 一些问题 在上

  • 问题内容: 我以前是这样写我的EXISTS检查的: 前一世代的DBA告诉我,当我做一个子句时,请使用而不是 这真的有区别吗? 问题答案: 不,SQL Server很聪明,并且知道它已用于EXISTS,并且不向系统返回任何数据。 Quoth Microsoft:http ://technet.microsoft.com/en- us/library/ms189259.aspx?ppud =4 由EX

  • 问题内容: 我有一张表,每个日期都有一些统计信息,我想用MySQL列出。对于某些日期,将没有统计信息,因此结果应类似于以下内容: 2013-03-01:3 2013-03-02:2 2013-03-03:0 2013-03-04:1 我发现可以用一个单独的表(包含所有可能的日期和LEFT JOIN)来解决用0-零-填补空白的问题。到目前为止,一切都很好。 统计信息(展示次数)位于“ campaig

  • 我有一个类Api,它包含一个数据列表:

  • 问题内容: 当表开始增长时,我担心WHERE子句中IN的性能。有没有人对这种查询有更好的策略?子查询返回的记录数比TradeLine表中的记录数增长得慢得多。TradeLine表本身以每天10个的速度增长。 谢谢你。 编辑:我使用了将子查询从WHERE移到FROM的想法。我对有助于此新查询的所有答案投了赞成票。 问题答案: 子句中的子查询不依赖于外部查询中的任何内容。您可以安全地将其移到子句中;一