你会如何优化这个SQL查询

时间:2013-08-01 00:02:12

标签: php sql

任何人都可以帮我优化这个查询,

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秒

还有其他方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

第一步是使用JOIN而不是嵌套查询:

SELECT A, B
FROM tableAA
JOIN tableBB on C=D
JOIN tableCC on E=F
WHERE G='$selected'
ORDER BY A

然后确保所有表都已正确编入索引。如果CD具有相同的名称,那就更好了,因为您可以使用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;