如何优化此特定查询?

时间:2016-08-05 14:07:32

标签: mysql

为了从table2中删除table1中不存在的行,我运行以下查询(每个表包含大约100万行):

DELETE table2
FROM   table2 LEFT JOIN table1 ON table2.col2 = table1.col2
WHERE  table1.col2 IS NULL

这需要很长时间。为此,我创建了一个使用临时表的存储过程(temp_col2小于table2,因为它有一列而不是table2有的20列。)

CREATE PROCEDURE delete_old_rows()
   BEGIN
        CREATE TEMPORARY TABLE temp_col2 select col2 from table2;

        delete table2 FROM  table2
        LEFT JOIN temp_col2 ON table2.col2 = temp_col2.col2
        WHERE col2 IS NULL;

       DROP TEMPORARY TABLE IF EXISTS temp_sepet_id;
   END

但它仍然很慢。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

根据评论,您的查询看起来很好,将删除约100万行中的1/4。这需要做很多工作,特别是如果您使用默认的行级锁定。

通过将语句包装在事务中并在执行删除时将表锁定为独占模式来减少锁定开销:

template <unsigned int n>
struct factorial {
    enum { value = n * factorial<n - 1>::value };
};

template <>
struct factorial<0> {
    enum { value = 1 };
};
相关问题