比方说,我有以下形式的查询:
SELECT a, b, c, d
FROM table1
WHERE a IN (
SELECT x
FROM table2
WHERE some_condition);
现在的查询IN
可以返回的记录数量巨大。 假设a
是主键,所以使用索引这是写这样的查询的最佳方式?
或者,它是在每个子查询返回的记录更优化的循环?
对我来说,很清楚,当我做了where a = X
很显然,我只是做一个索引(树)遍历。
但我不知道如何的IN
(尤其是在一个巨大的数据集)将遍历/利用索引。
MySQL优化是不是真的准备好了(喷气)正确处理这个你应该这种查询重写到内连接和索引正确,这将是禁食方法假设t1.a和t2.x是独一无二的
这样的事情。
SELECT
a
, b
, c
, d
FROM
table1 as t1
INNER JOIN
table2 as t2
ON t1.a = t2.x
WHERE
t1.some_condition ....
并确保t1.a和t2.x有主键或唯一索引
有1个查询,而不是循环肯定会有更有效的(和性质相符,以获得与环一般你将不得不使用一致的结果serializable
交易)。 人们可以有利于争论EXISTS
VS IN
; 据我记得MySQL的产生(或至少它提供了最多5.1是真的)......
利用上索引的效率a
取决于数目和顺序子查询结果(假定优化的动产首先抓住从子查询结果,然后将其与比较a
)。 在我的理解中,最快的选项是进行合并连接需要有相同键排序结果集两者; 然而,它可能不是可能的,因为不同的排序顺序。 然后,我想这是优化决策是否进行排序或使用循环联接。 你可以依靠自己的选择或尝试使用提示,看看它是否有差别。