保留每位用户最近100笔交易,并删除其余交易

远2005

我有一个名为tbl_tmp_trans的表,它包含曾经做过的每个用户事务(现在最多6Mil!)

我们决定在我们的数据库中仅保留每个用户的最后100个事务,因此我们可以保持数据库干净,这是我提出的查询

delete  from tbl_tmp_trans 
where   trans_id in 
(
    select  trans_id 
    from 
    (
        select  trans_id 
        from    tbl_faucets_transactions 
        order   by date 
        group   by user_id 
        limit   100
    ) foo 
)

我究竟做错了什么?

因为这样做后,我的cpu达到了100%,mysql崩溃了。

在此先感谢PS:我们的数据库是Mysql,表引擎是Innodb

P.S2:我们大约有12万,而转换表有将近600万条记录

lp_

我有个建议...希望能对您有所帮助。

修改表格:

alter table tbl_tmp_trans add column todel tinyint(1);

实现一个存储过程,以使用游标遍历表并标记(设置todel1)应删除的记录。为此的示例过程:

delimiter //
drop procedure if exists mark_old_transactions //
create procedure mark_old_transactions()
begin
    declare done int default false;
    declare tid int;
    declare uid int;
    declare last_uid int default 0;
    declare count int default 0;
    declare cur cursor for select trans_id, user_id from tbl_tmp_trans order by user_id, date desc;
    declare continue handler for not found set done = true;

    open cur;
    repeat
        fetch cur into tid, uid;
        if (!done) then
            if (uid!=last_uid) then
                set count = 0;
            end if;
            set last_uid = uid;
            set count = count + 1;
            if (count > 100) then
                update tbl_tmp_trans set todel=1 where trans_id=tid;
            end if;
        end if;
    until done
    end repeat;
    close cur;
end //

调用该过程,也许做一些简单的检查(从表中删除多少个事务,等等),然后删除标记的记录。

call mark_old_transactions;
-- select count(*) from tbl_tmp_trans where todel=1;
-- select count(*) from tbl_tmp_trans;
delete from tbl_tmp_trans where todel=1;

最后,删除我们刚刚添加的列。

alter table tbl_tmp_trans drop column todel;

一些注意事项:

  • 可能无论如何您都必须遍历表的所有记录,因此不会使游标失去性能。
  • 如果您有约12万名用户和约600万笔交易,那么平均每个用户有约50笔交易。这意味着,您可能实际上并没有太多用户拥有超过100个事务,因此更新数量(希望)不会太多。=>该过程运行相对较快。
  • 使用新列再次删除应该很快。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

YUM断笔交易

来自分类Dev

如何平均最近5笔交易的最后一笔金额

来自分类Dev

删除交易对

来自分类Dev

如何在SQL中查询每个项目的最近五笔交易

来自分类Dev

SQL查询最后一笔交易

来自分类Dev

按日期从交易表中获取最近的交易

来自分类Dev

第二笔交易覆盖第一笔交易的更改

来自分类Dev

比较用户余额与交易总额

来自分类Dev

将从交易内部删除,从交易后删除记录

来自分类Dev

sqlite交易不尊重删除

来自分类Dev

删除“旧”还原购买交易

来自分类Dev

在asp.net客户中,如何与Paypal进行一笔交易来减少客户交易?

来自分类Dev

同一客户的第二笔交易未能增加交易数量

来自分类Dev

可以在单个键值对上每秒重做数百笔交易

来自分类Dev

级联会在1笔交易中发生吗?

来自分类Dev

级联会在1笔交易中发生吗?

来自分类Dev

在一笔交易中发送多条 jms 消息

来自分类Dev

如何在一笔交易中移动多个 blob?

来自分类Dev

Tradestats交易与交易

来自分类Dev

如何删除RabbitMQ交易所?

来自分类Dev

如何删除电子商务交易?

来自分类Dev

RabbitMQ:如何批量删除交易所?

来自分类Dev

Google Analytics(分析):从后台删除/编辑交易

来自分类Dev

如何删除电子商务交易?

来自分类Dev

获取所有最近的交易并总计并在datagridview中查看

来自分类Dev

代收交易

来自分类Dev

交易无效

来自分类Dev

交易超时

来自分类Dev

Laravel交易