MySQL也能併發匯入資料
對MySQL的使用者而言,備受詬病的一個問題就是匯入SQL備份檔案時不能併發,使得匯入的效率很低。
今天,我們就來改變下思路,嘗試一下併發匯入的方法,供大家參考。
1、問題分析
想要實現併發匯入,其實沒那麼難,最簡單的思路就是:將完整的檔案切分成多份,然後併發匯入即可。
在這裡,我自己的做法是這樣的:
1) 首先,假設只有一個庫;多個庫的情況也是類似,無非就是迴圈 2) 計算SQL檔案總行數 3) 計算SQL檔案總大小 4) 設定每個切分檔案最大尺寸 5) 初始化表結構 6) 迴圈處理SQL,按照切分檔案最大尺寸切分成多個小檔案 7) 併發匯入多個小檔案
上述方法中,如果資料表是 MyISAM 表,則併發匯入沒有問題,但如果是 InnoDB 表,則會有表級鎖 AUOT-INC 導致併發效率不高的麻煩,儘管如此,那也比單個檔案序列匯入來的快一些。想要避免這個麻煩,就得采用 MySQL 5.1 版本了,因為在 5.1 中,改進了 AUTO-INC 的處理方式,規避了表級鎖,很大程度提高了併發效率。
2、實際測試
事先設定:最大並大匯入執行緒是16個。
2.1 MySQL 5.0.67 版本
innodb_flush_log_at_trx_commit = 1 序列匯入:01:51:34 並行匯入:01:25:05 innodb_flush_log_at_trx_commit = 0 序列匯入:01:49:36 並行匯入:01:11:29
2.2 MySQL 5.1版本
innodb_flush_log_at_trx_commit = 1, innodb_autoinc_lock_mode = 0 序列匯入:01:52:28 並行匯入:01:38:13 innodb_flush_log_at_trx_commit = 1, innodb_autoinc_lock_mode = 1 序列匯入:01:54:55 並行匯入:01:26:24 innodb_autoinc_lock_mode = 0 並行匯入:01:38:13 innodb_autoinc_lock_mode = 1 並行匯入:01:05:51
更加詳細的測試就不再做了。
3、小結
從上面的測試結果可以看到,MySQL 5.1在AUTO-INC鎖方面的改進還是非常大的,對於想要提升併發效能,同時應用相對不是太複雜,並且不擔心會碰到bug的童鞋可以多多嘗試下。
由於眾所周知的緣故,相關的指令碼就不釋出了,有需要的童鞋請加入MSN群討論。
覺得文章有用?立即:和朋友一起共學習 共進步!
建議繼續學習:
- 一種常見的併發程式設計場景的處理 (閱讀:22022)
- Rolling cURL: PHP併發最佳實踐 (閱讀:9369)
- 檢視 Apache併發請求數及其TCP連線狀態 (閱讀:7161)
- 大型高併發高負載網站的系統架構分析 (閱讀:6841)
- 大併發下的高效能程式設計 – 改進的(使用者態)自旋鎖 (閱讀:6143)
- 併發程式設計系列之一:鎖的意義 (閱讀:4841)
- 學習:一個併發的Cache (閱讀:4341)
- 併發框架Disruptor譯文 (閱讀:4200)
- C++多程序併發框架 (閱讀:4041)
- PHP 持久連線於併發 (閱讀:3822)
QQ技術交流群:445447336,歡迎加入!
掃一掃訂閱我的微訊號:IT技術部落格大學習