免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4397 | 回复: 4
打印 上一主题 下一主题

关于千万级数据的删除写入问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-28 15:26 |只看该作者 |倒序浏览
本帖最后由 millerrch 于 2011-06-28 15:30 编辑

现在有一个表,用来存放设备的状态日志,状态日志是20秒写入一次一般,当状态日志数据有千万条左右时,如果想删除某个时刻以前的数据,比如删个几百万条,删除数据的脚本就会一直执行没反应,而且此时无法写入新的状态日志数据也
如果只删除几十万条数据,则可以写入新的数据,但是删除数据的操作没法进行,报错Lock wait timeout exceeded; try restarting transaction
是因为删除的数据量过大,提交删除数据时,耗时太久的缘故么?还是别的原因,望达人赐教啊,THX~~


顺便问个别的问题,我导出这个大数据的表正常,不过有600多M,但是导入另一个mysql就报错 Got a packet bigger than \max_allowed_packet\ bytes

我把/etc/my.cnf中的max-allowed-packet,改成32M了,重启mysql不管用啊,看还有人说得改my.ini,这个文件在哪儿?是这个问题么?改成多大合适,先谢谢了哈,改成800M以后报了一个其中一条数据的错误,然后再看表里现在也有数据了,导出后才200多M,数据变成200多W了···

论坛徽章:
0
2 [报告]
发表于 2011-06-28 17:45 |只看该作者
可见楼主还没分清my.ini是windows的配置文件,/etc/my.cnf是linux的配置文件。。。

你这个日志的设计就是不合理的。无论怎么样优化,都是这个样子。如果要想性能上去,分表吧。

导入导出的问题,我不清楚你具体怎么做的,估计也是命令使用不合理,哈哈。

论坛徽章:
0
3 [报告]
发表于 2011-06-29 13:27 |只看该作者
回复 1# millerrch


  关于修改my.cnf还是my.ini见楼上兄弟所言


阅读到的重要信息:
1.用来存放设备的状态日志,状态日志是20秒写入一次一般
2.对于需要删除大量数据,且是某个时间点之前的
----------------------------------------------------------------

分析、猜测:
我是否可以理解为只有INSERT操作每条数据的写入应该都是有写入时间,对吧...

做法有2种:

方法一:
1.存储表引擎为InnoDB引擎的表
2.时间字段上必须创建索引

方法二:
1.使用分区表
2.若是按天,删除的数据,则按天进行分区
3.若是按小时,则删除的数据,则按小时进行分区
4.时间字段必须为主键或主键的一部分,或则至少创建索引

论坛徽章:
0
4 [报告]
发表于 2011-06-29 16:52 |只看该作者
innodb_log_file_size  这个要加大

用存储过程 分段删除提交  参看oralce大表 删除

论坛徽章:
0
5 [报告]
发表于 2011-06-30 19:39 |只看该作者
INSERT和DELETE操作,都会给表加X锁,如果删除的范围过广,或者没有用到索引,那么就会全表加X锁,这时候两个操作就只有一个能执行,另外一个等待锁释放。

比较科学的办法是在时间字段上加索引,更快的定位到要删除的记录,然后一次删除的记录可以少点,多分几次删除。

用分区表也是个很好的办法,删除历史记录,速度无与伦比。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP