一.問題
很早以前做了一個更新功能,就是將A表中的數據全部查找出來,相對B表中改變的數據更新B表,B表中沒有的數據插入B表。
最近發現該功能執行速率減慢,有時還跑超時。原來是A表中數據漸漸變多,就有了這個問題。
二.優化知識
1.循環每條插入改為一條語句插入多條。
即使用 insert into table () values (),(),(),()插入,如果字符串太長,可暫時設置 ini_set('memory_limit','1024M');
這是因為合並后日志量(MySQL的binlog和innodb的事務讓日志)減少了,降低日志刷盤的數據量和頻率,從而提高效率。通過合並SQL語句,同時也能減少SQL語句解析的次數,減少網絡傳輸的IO。
2.在事務中進行插入處理
使用事務可以提高數據的插入效率,這是因為進行一個INSERT操作時,MySQL內部會建立一個事務,在事務內才進行真正插入處理操作。通過使用事務可以減少創建事務的消耗,所有插入都在執行后才進行提交操作。
3.如果可以數據有序插入
這是因為由於數據庫插入時,需要維護索引數據,無序的記錄會增大維護索引的成本
4.分批次插入
三.解決
分批次取出數據,每批數據先做處理,有更新的更新,要插入的拼接成一條sql語句,最后一次性插入。每批數據的處理都放在事務中。
