为了从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
但它仍然很慢。我该如何解决这个问题?
答案 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 };
};