mysql删除百万级数据库_MSSQL、MySQL数据库删除⼤批量
千万级百万级数据的优化...
SQL Server上⾯删除1.6亿条记录,不能⽤Truncate(因为只是删除其中少部分数据)。
经过实验,每次删除400万条要花1.5 - 3⼩时,⽽且是越到后⾯越慢,正常的话,需要⼤约102个⼩时,⼤约4天半时间。这在⽣产环境下是不能接受的。
经过⼀个处理之后,我每次删除400万条记录花5 - 6分钟,删除全部1.6亿条记录花了4 - 5个⼩时!
为什么??
每次删除记录,数据库都要相应地更新索引,这是很慢的IO操作,⽽且后⾯索引碎⽚越来越多,就更慢,这就是为什么⼀开始只花1.5⼩时,后⾯要3⼩时才能删除400万条记录的原因。
删除之前,做个完整备份。
我在删除前先保存当前索引的DDL,然后删除其索引,
然后根据使⽤的删除条件建⽴⼀个临时的索引(这是提⾼速度的另外⼀个重要原因!)
开始删除操作,完成之后再重建之前的索引。
如果需要保留的数据⽐较少的话,可以把要保留的数据备份出来。在drop表。重新创建,先不要急着创建索引、主键,把数据导回去,然后在建索引、约束之类的。
记得在删除的时候不要在记录⽇志的模式下⾯,否则⽇志⽂件就要爆了。mysql删除重复的数据保留一条
2、在My SQL数据库使⽤中,有的表存储数据量⽐较⼤,达到每天三百万条记录左右,此表中建⽴了三个索引,这些索引都是必须的,其他程序要使⽤。
由于要求此表中的数据只保留当天的数据,所以每当在凌晨的某⼀时刻当其他程序处理完其中的数据后要删除该表中昨天以及以前的数据,使⽤delete删除表中的上百万条记录时,MySQL删除速度⾮常缓慢每⼀万条记录需要⼤概4分钟左右,这样删除所有⽆⽤数据要达到⼋个⼩时以上,这是难以接受的。
查询MySQL官⽅⼿册得知删除数据的速度和创建的索引数量是成正⽐的,于是删除掉其中的两个索引后测试,发现此时删除速度相当快,⼀百万条记录在⼀分钟多⼀些,可是这两个索引其他模块在每天⼀次的数据整理中还要使⽤,于是想到了⼀个折中的办法:
在删除数据之前删除这两个索引,此时需要三分钟多⼀些,然后删除其中⽆⽤数据,此过程需要不到
两分钟,删除完成后重新创建索引,因为此时数据库中的数据相对较少,约三四⼗万条记录(此表中的数据每⼩时会增加约⼗万条),创建索引也⾮常快,约⼗分钟左右。这样整个删除过程只需要约15分钟。对⽐之前的⼋个⼩时,⼤⼤节省了时间。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论