mysql教學欄位介紹批次SQL插入
##推薦(免費):mysql教學
#對於某些資料量較大的系統,資料庫面臨的問題除了查詢效率低下,還有就是資料入庫時間長。特別像報表系統,每天花在資料導入上的時間可能會長達幾個小時或十幾個小時之久。因此,優化資料庫插入效能是很有意義的。
一條SQL語句插入多條資料
INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1);
INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0), ('1', 'userid_1', 'content_1', 1);
在事務中進行插入處理
START TRANSACTION;INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1);...COMMIT;
資料有序插入
#資料有序的插入是插入記錄在主鍵上的有順序排序INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('2', 'userid_2', 'content_2',2);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('2', 'userid_2', 'content_2',2);
參考InnoDB使用的B tree索引,如果每次插入記錄都在索引的最後面,索引的定位效率很高,並且對索引調整較少;如果插入的記錄在索引中間,需要B tree進行分裂合併等處理,會消耗比較多計算資源,且插入記錄的索引定位效率會下降,資料量較大時會有頻繁的磁碟操作。測試比較數據,隨機數據與順序數據的效能比較
先刪除索引,插入完成後重建索引
效能綜合測試
注意事項
max_allowed_packet配置可以修改,預設
1M,測試時可以修改為
8M。
innodb_log_buffer_size配置項,超過這個值會把innodb的資料刷到磁碟中,這時,效率會下降。所以較好的做法是,在資料達到這個值之前執行事務提交。
以上是詳解MySQL批量SQL插入的效能最佳化的詳細內容。更多資訊請關注PHP中文網其他相關文章!