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

2018-08-29  本文已影响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表中

上一篇下一篇

猜你喜欢

热点阅读