mysql插入性能改善


1、innoDB是mysql引擎中唯一支持事務transaction的引擎。默認所有用戶行爲都在事務內發生。
默認mysql建立新連接時,innoDB採用自動提交autocommit模式,每個SQL語句在它自己上形成一個單獨的事務,即insert一次就commit了一次,InnoDB在該事務提交時必須刷新日誌到磁盤,因此效率受限於磁盤讀寫效率。
你可以通過
mysql_query("SET AUTOCOMMIT = 0");
來關閉自動提交模式。

如果自動提交模式被關閉,那麼我們可以認爲一個用戶總是有一個事務打開着。一個SQL COMMIT或ROLLBACK語句結束當前事務並且一個新事務開始。兩個語句都釋放所有在當前事務中被設置的InnoDB鎖定。一個COMMIT語句意味着在當前事務中做的改變被生成爲永久的,並且變成其它用戶可見的。一個ROLLBACK語句,在另一方面,撤銷所有當前事務做的修改。
當然如果是自動提交模式,通過用明確的START TRANSACTION或BEGIN語句來開始一個事務,並用COMMIT或者ROLLBACK語句來結束它,這樣用戶仍舊可以執行一個多重語句事務。

2、因此對於本例,在建立數據庫連接後,立即關閉自動提交,在foreach循環結束後,一次commit即可,效率大大提升。

mysql_query("SET AUTOCOMMIT = 0");
foreach(***)
  INSERT INTO Table(columnA, columnB) VALUES (valueA, valueB)
mysql_query("commit");

3、對於多次insert行到同一表的需求,你還可以採用多行插入語法來減少客戶端和服務器之間的通訊開支。


INSERT INTO Table(columnA, columnB) VALUES (1,2), (5,5), (3,3), ...

4、如果你的表有索引,索引會拖慢insert速度。大量插入數據時,可以先關閉索引,然後再重建索引。

ALTER TABLE Table DISABLE KEYS;
INSERT INTO ***;

ALTER TABLE Table ENABLE KEYS;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章