公司一个日志表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控制台程序转储千万级别数据库表
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...