小编Dan*_*nly的帖子

优化大记录删除流程

我正在创建一个反映我们生产数据库的数据库,但更轻且匿名 - 用于本地开发目的。

为了确保我们有足够的数据可供工程团队使用,我将删除所有日期设置updated_at为一年多前的客户。简单的过程是保留新用户,但保留旧用户或不活跃用户。

为此,我创建了一个存储过程。

DELIMITER //
CREATE PROCEDURE delete_old_customers()
BEGIN
    SET @increment = 0;
    customer_loop: LOOP

        DELETE FROM customers 
        WHERE id BETWEEN @increment AND @increment+999
        AND updated_at < DATE_SUB(CURRENT_DATE(), INTERVAL 1 YEAR);

        IF @increment > (SELECT MAX(id) FROM customers) THEN
            LEAVE customer_loop;
        END IF;

        SET @increment = @increment + 1000;

    END LOOP customer_loop;
END //
DELIMITER ;

CALL delete_old_customers();

DROP PROCEDURE delete_old_customers;
Run Code Online (Sandbox Code Playgroud)

因此,此过程将删除分批分成 1000 个组,并一直运行,直到没有更多客户需要处理。

我运行这样的程序:

mysql "$MYSQLOPTS" devdb < ./queries/customer.sql
Run Code Online (Sandbox Code Playgroud)

其中$MYSQLOPTS指的是具有以下选项的 my.cnf 文件:

[mysqld] …
Run Code Online (Sandbox Code Playgroud)

mysql performance stored-procedures optimization query-performance

5
推荐指数
1
解决办法
4358
查看次数