SQL子查询效率更高吗

问题描述 投票:0回答:2

试图理解这一点,但当我停止使用子查询时,代码效率提高了 10 倍以上。 Table2 大约有 5000 行,而 table1 相当大,有几十万行。

原声明

SELECT * 
FROM table1 
WHERE indexedCol IN (
   SELECT indexedCol 
   FROM table2 
   WHERE iCol2 = "somevalue"
)

所以不知何故,这效率更高。

SELECT * 
FROM table1 
WHERE indexedCol IN 
  (*comma separated result of SELECT FROM table2*)

我在这里缺少什么吗?或者子查询从来都不是一个好主意。

mysql sql subquery
2个回答
1
投票

真正的问题是子查询相关吗? 我这么说是什么意思? 如果子查询引用table1。 如果没有,那么答案很简单——如果你有两个疑问

SELECT * 
FROM table1 

SELECT indexedCol 
FROM table2 
WHERE iCol2 = "somevalue"

运行其中一个所需的时间少于运行两个所需的时间。 如果为每一行运行其中一个,情况可能会更糟(如评论中所建议)。

可以重写此查询以使用如下连接:

SELECT *
FROM TABLE1
JOIN TABLE2 on TABLE1.indexedCol = TABLE2.indexedCol and TABLE2.iCol2 = 'some value'

这可能会解决您的问题。


0
投票

子查询通常会增加查询成本,并且成本随着子查询的访问而累积。根据您如何使用它,您可以降低代码成本并提高可读性。

如果您使用关联子查询,并且子查询中包含连接,则会降低性能并破坏可读性。只有当我必须使用存在或 GROUP BY 查询时,我才会使用它。

从存在的客户中选择*(从销售中选择客户ID,其中客户.客户ID=销售.客户ID);

相反,如果正确使用嵌套子查询,将会提高性能。特别是如果您知道子查询会限制返回的数据量,那么这是提高性能的绝佳方法。

从表1中选择* WHERE indexedCol IN (SELECT FROM table2 的逗号分隔结果)

从 A_TABLE A 中选择 * 左连接 ( 从 B_TABLE 中选择 AB、CD、EF 数据在哪里 IN (SELECT DATA FROM C_TABLE /限制返回的数据为10/) )B 上 A.AB =B.AB

© www.soinside.com 2019 - 2024. All rights reserved.