我正在创建一个反映我们生产数据库的数据库,但更轻且匿名 - 用于本地开发目的。
为了确保我们有足够的数据可供工程团队使用,我将删除所有日期设置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