试图理解这一点,但当我停止使用子查询时,代码效率提高了 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*)
我在这里缺少什么吗?或者子查询从来都不是一个好主意。
真正的问题是子查询相关吗? 我这么说是什么意思? 如果子查询引用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'
这可能会解决您的问题。
子查询通常会增加查询成本,并且成本随着子查询的访问而累积。根据您如何使用它,您可以降低代码成本并提高可读性。
如果您使用关联子查询,并且子查询中包含连接,则会降低性能并破坏可读性。只有当我必须使用存在或 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