任何人都可以帮我优化这个查询,
SELECT
A,
B
FROM tableAA
WHERE (C IN (SELECT D
FROM tableBB
WHERE (E IN (SELECT F
FROM tableCC
WHERE (G='$selected')
)
)
)
) AND (G=$SELECTED22)
ORDER BY
A;
鉴于
TABLEAA:100万名女孩
TABLEBB:2200万名女性
TABLECC:7900万名女性
它有效,但需要花费太多时间,差不多30秒
还有其他方法可以解决这个问题吗?
答案 0 :(得分:2)
第一步是使用JOIN而不是嵌套查询:
SELECT A, B
FROM tableAA
JOIN tableBB on C=D
JOIN tableCC on E=F
WHERE G='$selected'
ORDER BY A
然后确保所有表都已正确编入索引。如果C
和D
具有相同的名称,那就更好了,因为您可以使用USING (C)
(对于E / F也是如此)
答案 1 :(得分:0)
内部联接而不是IN关键字。之后,确保正确设置索引(如果没有正确的索引,ORDER BY可能很昂贵)
答案 2 :(得分:0)
1)首先,确保所有表都包含主键 2)第二,尽量不要使用关键字'IN',因为它会执行全表扫描,总是阻止全表扫描以便快速查询
3)检查你的A和B是否已编入索引〜
SELECT A, B
FROM tableAA
INNER JOIN tableBB with (nolock) on C=D //only if C and D doesnt contain and null value
//if there are null value, use left outer join
INNER JOIN tableCC with (nolock) on E=F //only if E and F doesnt contain any null value
//if there are null value, use left outer join
WHERE G='$selected'
ORDER BY A;