以下两个查询是子查询。两者相同,都对我有效。但是问题是方法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 。
在这种情况下,IN
sort会根据的位置Count(*)
选择 所有 匹配的行,WHERE
因为它正在比较所有值。
但也不要忘记这一点:
EXISTS``IN
当子查询结果非常大时,针对:高速执行。IN
领先于EXISTS
:子查询结果非常小时。参考以获取更多详细信息:
本文向大家介绍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的想法。我对有助于此新查询的所有答案投了赞成票。 问题答案: 子句中的子查询不依赖于外部查询中的任何内容。您可以安全地将其移到子句中;一