首先想到的是,一條一條更新的速度太慢了,然后就想批量更新,一次更新N條數據。實踐是檢驗真理的唯一標准,不一會兒,代碼就敲完了,重新試了一下,效果依舊不理想。啊哦,真是要崩潰!后面又想到了利用異步,我一下子開多個mysql連接,同時處理,可是依舊慢的一筆。然后就放棄了,更新的效率肯定是滿足不了了。然后就想着繞彎子了,我新建一張表,把舊表數據取出來,處理完后,直接插入到新表,然后再把舊表刪除,把新表重新命名成舊表的名字。想想,insert into的速度應該會比update快不少。但是要把舊表數據全部取出來,內存會爆掉,所以我就用慢慢取的方式, select+limit。試了一下,速度快了不少,但是感覺也得跑個一個多小時。雖然快了很多,但是這速度肯定還是不行。
然后試了下,select的時候用select + where + order by + limit的方法,where和order by都是用time去處理,跑了一下,十來分鍾就搞定了。后面想想,where和order by的時候用表的主鍵去處理,應該會快點,然后就試了一下,哇塞,效果很明顯,select + where + order by + limit的方法(用主鍵去處理where 和order by) ,一分鍾就處理完了所有數據。取一次數據,處理完數據后,插入一次數據,可以根據自己的數據量大小,適當調整一次要select多少條數據出來。記住,select出來后,處理完,一次性插入新表,不要一條條插入!
最終結果,用select + where + order by + limit的方法(用主鍵去處理where 和order by) ,一分鍾左右就處理完了五百萬條左右的數據,有好幾張表,其中有兩張表都各有一兩百萬條的數據,而最初的那種逐條update的方法,預計得十個小時以上。雖然幾經波折,最后終於放心地交差了。
重點:普通的select方式取出來速度很慢,插入新表的方案,性能的關鍵點在於從舊表select出數據,至於插入,只要使用批量插入就好啦!
小插曲: 創建新表的時候,我是用復制舊表結構的方式去創建的,復制舊表結構的時候,記得使用create table newTableName like oldTableName的方式,不然會沒有把舊表的索引復制過來
