0

谁能帮我优化这个查询,

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 秒

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

4

3 回答 3

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 也一样)

于 2013-08-01T00:08:22.177 回答
0

内部联接而不是 IN 关键字。之后,确保您正确设置了索引(如果没有正确的索引,ORDER BY 可能会很昂贵)

于 2013-08-01T00:10:52.450 回答
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; 
于 2013-08-01T02:41:52.057 回答