有没有办法加快这个查询?

时间:2012-01-16 20:54:15

标签: mysql sql database

我有两张桌子,一张是另一张桌子的副本。 (我必须删除父母中不再存在的记录)。运行此查询有效,但需要大约1分钟才能完成。我知道NOT EXISTS更快,因为我不会为每一行运行子查询,但不会返回任何结果。

SELECT mlscopy.listing_listnum 
FROM mlscopy 
WHERE mlscopy.listing_listnum 
NOT IN (SELECT mls_cvrmls.listing_listnum FROM mls_cvrmls)

我将澄清,这里的问题是父母随着时间的推移而变化,我必须从孩子那里删除/添加记录。所以我一直坚持要从child中删除list_listnum不存在的孩子。

这是不存在的查询

SELECT mlscopy.listing_listnum 
FROM mlscopy 
WHERE 
NOT EXISTS (SELECT mls_cvrmls.listing_listnum FROM mls_cvrmls)

想出来

SELECT mlscopy.listing_listnum
FROM mlscopy 
WHERE NOT EXISTS (
SELECT mls_cvrmls.listing_listnum 
FROM mls_cvrmls
WHERE mlscopy.listing_listnum = mls_cvrmls.listing_listnum
)

3 个答案:

答案 0 :(得分:2)

尝试这种变化,看看它是否更好:

SELECT mlscopy.listing_listnum 
    FROM mlscopy 
        LEFT JOIN mls_cvrmls
            ON mlscopy.listing_listnum = mls_cvrmls.listing_listnum
    WHERE mls_cvrmls.listing_listnum IS NULL

答案 1 :(得分:0)

试试这个:

CREATE INDEX i_listnum ON mls_cvrmls(listing_listnum ASC)

尝试使用LEFT JOINNOT EXISTS重写查询可能不会产生太大的影响,因为查询优化器可以解决这个问题。

然而,通过mls_cvrmls快速找到listing_listnum中的行的意思只能提高效果(但需要额外的空间)。

About index creations

另一种选择可能是:

SELECT listing_listnum FROM mlscopy
 MINUS
SELECT listing_listnum FROM mls_cvrmls

答案 2 :(得分:0)

SELECT mlscopy.listing_listnum 
FROM mlscopy A
NOT EXISTS
(
    SELECT *
    FROM mls_cvrmls B
    WHERE B.listing_listnum = A.listing_listnum
);