Written by
arstercz
-
表记录清理注意事项
常规表清理见 pt-archiver 工具: [pt-archiver]/top-10-percona-toolkit-tools-%E4%B8%80/)
-
1 如果表更新频繁, 不要直接使用
delete ... where id <= ? and update_time < ?
这类范围或结果集过大的SQL, 避免delete操作时间过长吃满thread资源影响服务; -
2 如果满足条件的记录很多,
delete
操作会是耗时操作,同样会引起1中的问题, 应用或脚本应该找出结果集范围对应的主键或唯一键信息, 通过分组方式一组一组的删除相应的id列表; -
3 给予delete操作低优先级, 减少影响表的正常更新, 如
delete low_priority from table ...
; -
4 如果结果集太大, 分组间隔可以增加sleep信息避免频繁更新引起的io或负载问题;
-
5 不要单条记录清除, 如果记录多, 与DB的交互会过于频繁;
脚本清理记录举例如下:
(1) 按条件取出主键id的信息, 存入数组@list中;
select id from user where count <= ? and update_time < ?
(2) 分组执行清理操作, 每次的清理的数量为指定的chunk大小:
foreach my $bound ( 0 .. int(@list/$chunk) ) {
my $id_list;
if ( $bound != int(@list/$chunk) ) {
$id_list = join(', ', @list[ 0 + $chunk*$bound .. $chunk*(1+$bound) - 1 ]);
} else {
$id_list = join(', ', @list[ $chunk*$bound .. $#list ]);
}
...
...
$dbh_master->do("delete low_priority from user_login where id in ( $id_list )") or die $dbh_master->errstr;
sleep 1;
}