美文网首页
php控制台程序转储千万级别数据库表

php控制台程序转储千万级别数据库表

作者: 聆行 | 来源:发表于2018-08-29 10:03 被阅读0次

    公司一个日志表log(id,uid,ctime),里面每年有一千多万条记录,ctime是记录时间,并且有索引,现在根据年份分别转储到log_2016,log_2017的表中,并删除原表相关数据。

    注意事项:

    1.php使用set_time_limit(0) 防止超时退出

    2.注意使用sleep,防止过多占用cpu时间,影响其他任务

    3.注意操作步长,不要太长也不要太短

    4.筛选方式

                1)select * from log where ctime between '2017-01-01 00:00:00' and '2018-01-01 00:00:0'

                2)select * from log where ctime like '2017%'

                没有比对哪种方式更好

    4.转储方式:

            1)将步长内的数据读到php端,然后循环insert进表

            2)直接insert into select ....

             肯定是第二种方式更好,纯数据库操作

    5.删除方式

            1)转储完成后统一删除

            2)转储步长数据后,立即删除该部分数据

            第二种方式更好,避免最后一次性删除大量数据,造成cpu占用和数据库响应慢

    6.步长操作方式

            1) insert into log_2016 select ... where ctime like '2016%' order by id limit 5000

                    delete from log where ctime like '2016%' order by id limit 5000

            2)   select min(id) as id from log  where ctime like '2016%' 

                    union all

                   select max(id) as id from log  where ctime like '2016%' 

                    先获得符合时间限制的最大最小id

                    insert into log_2016 select ...  where id between minID and maxID

                    delete from log where  id between minID and maxID

                    第二种方式性能好很多,因为批量操作时只使用主键索引,但是如果后续年份记录有被修改过,则会造成不相关数据被转移,比如2017年有一条数据被改成了2016年的,则maxID会异常,导致部分2017年数据被误操作到log_2016表中

    相关文章

      网友评论

          本文标题:php控制台程序转储千万级别数据库表

          本文链接:https://www.haomeiwen.com/subject/odqhwftx.html