表记录清理注意事项

By | November 12, 2014

常规表清理见 pt-archiver 工具: pt-archiver

  • 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;
    }

Leave a Reply

Your email address will not be published. Required fields are marked *