今天就来跟大家唠唠我更新数据库那点儿破事儿,标题是“updatedata”,这名字听着就够直白?我这也是一头雾水,心里琢磨着:“这数据更新不就是个update语句的事儿吗?能有多复杂?”结果真动起手来,还真不是那么简单。
我接到需求,要把数据库里几千万条数据更新一遍,心里还嘀咕着:“这不就一条语句的事情吗?”。我直接就写一个大大的update语句,心想:“这还不简单?”结果这一跑,好家伙,直接给我卡死,整个数据库半天没反应,等半天还是没动静。把我急的呀,感觉就像热锅上的蚂蚁,坐立不安。我心想“这是咋回事?难不成是我的语句写错?”
经过一番折腾,到处找资料,总算弄明白,原来这大数据量的更新,还真不能这么干。这就像是你想把一整个水库的水一次性倒进一个小池塘,那还不把池塘给撑爆?得慢慢来,一点一点地倒。
后来我就开始尝试各种法子。我想的是,要不我分批更新?这就好比把大象切成小块儿,一块一块儿地放进冰箱。于是我把update语句改改,加个where条件,限制每次更新的数量。这下子,总算能跑起来,虽然速度还是很慢,但起码不会卡死。感觉就像是便秘好几天,终于能拉出来一点儿,虽然还不通畅,但总归是有点儿希望。
然后,我又琢磨着,要不我用个临时表试试?这临时表就像是个中转站,先把需要更新的数据倒腾到这个中转站里,然后再从中转站更新到目标表里。这就好比你要搬家,先把东西打包然后一件一件搬到新家,而不是一股脑儿全堆到新家门口。我把数据一批一批倒腾到临时表里,然后再从临时表更新到目标表。你别说,这法子还真管用,速度比之前快不少。我当时那个心情,就像是中彩票一样,兴奋得不得!
后来我又想起来,有个词叫做索引,听说挺好使的,就像给字典加上目录,查起来特别快。我寻思着:“既然查询的时候能用索引,更新的时候没准也能行?”我试着在需要更新的字段上建个索引,您猜怎么着?速度又快一截!这就像是给马儿喂草料,跑得更欢。
还有人说可以升级硬件。我当时心想:“硬件升级?那得花多少钱?有没有办法不用花钱也能把效率提高?”所以一开始我就没考虑硬件升级,我就琢磨着从软件上下手。后来我发现如果把硬件升级作为辅助手段,那效率可以提高更多!
这整个过程,就跟西天取经似的,经历九九八十一难。总算是把这事儿给搞定。虽然过程曲折点儿,但也让我学到不少东西。所以说,实践出真知,这话一点儿都不假。
- 先是一股脑更新,结果卡死;
- 后来分批更新,能跑,但慢;
- 然后用临时表,快点儿;
- 再然后建索引,又快点儿;
- 升级硬件,更快;
总之这回更新数据让我明白一个道理:干啥事儿都不能想得动脑子,多尝试,才能找到最好的办法。今天的分享就到这里,希望我的这些经验能帮到你们。如果你也有啥好法子,也欢迎留言分享给我!