公司有一個項目,需要頻繁的插入數據到MySQL數據庫中,設計目標要求能支持平均每秒插入1000條數據以上。目前功能已經實現,不過一做壓力測試,發現數據庫成爲瓶頸,每秒僅能插入100多條數據,遠遠達不到設計目標。
到MySQL官方網站查了查資料,發現MySQL支持在一條INSERT語句中插入多條記錄,格式如下:
INSERT table_name (column1, column2, ..., columnN)
VALUES (rec1_val1, rec1_val2, ..., rec1_valN),
(rec2_val1, rec2_val2, ..., rec2_valN),
... ...
(recM_val1, recM_val2, ..., recM_valN);
按MySQL官方網站,用這種方法一次插入多條數據,速度比一條一條插入要快很多。在一臺開發用的筆記本電腦上做了個測試,果然速度驚人。
測試環境:DELL Latitude D630, CPU T7250 @ 2.00GHz, 內存 2G。Windows XP Pro中文版SP2,MySQL 5.0 for Windows。
MySQL是新安裝的,建立了一個名爲test的數據庫,在test數據庫建了一個t_integer表,共兩個字段:test_id和test_value,兩個字段都是INTEGER類型,其中test_id是Primary Key。
準備了兩個SQL腳本文件(寫了個小程序生成的),內容分別如下:
-- test1.sql
TRUNCATE TABLE t_integer;
INSERT t_integer (test_id, test_value)
VALUES (1, 1234),
(2, 1234),
(3, 1234),
(4, 1234),
(5, 1234),
(6, 1234),
... ...
(9997, 1234),
(9998, 1234),
(9999, 1234),
(10000, 1234);
-- test2.sql
TRUNCATE TABLE t_integer;
INSERT t_integer (test_id, test_value) VALUES (1, 1234);
INSERT t_integer (test_id, test_value) VALUES (2, 1234);
INSERT t_integer (test_id, test_value) VALUES (3, 1234);
INSERT t_integer (test_id, test_value) VALUES (4, 1234);
INSERT t_integer (test_id, test_value) VALUES (5, 1234);
INSERT t_integer (test_id, test_value) VALUES (6, 1234);
... ...
INSERT t_integer (test_id, test_value) VALUES (9997, 1234);
INSERT t_integer (test_id, test_value) VALUES (9998, 1234);
INSERT t_integer (test_id, test_value) VALUES (9999, 1234);
INSERT t_integer (test_id, test_value) VALUES (10000, 1234);
以上兩個腳本通過mysql命令行運行,分別耗時0.44秒和136.14秒,相差達300倍。
基於這個思路,只要將需插入的數據進行合併處理,應該可以輕鬆達到每秒1000條的設計要求了。
補充:以上的測試都是在InnoDB表引擎基礎上進行的,而且是AUTOCOMMIT=1,對比下來速度差異非常顯著。之後我將t_integer表引擎設置爲MyISAM進行測試,test1.sql執行時間爲0.11秒,test2.sql爲1.64秒。
補充2:以上的測試均爲單機測試,之後做了跨機器的測試,測試客戶端(運行腳本的機器)和服務器是不同機器,服務器是另一臺筆記本,比單機測試時配置要好些。做跨機器的測試時,發現不管是InnoDB還是MyISAM,test1.sql速度都在0.4秒左右,而test2.sql在InnoDB時且AUTOCOMMIT=1時要80多秒,而設置爲MyISAM時也要20多秒。
MySQL大批量數據插入
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
sql語法、關係建模
死瘦宅
2019-02-24 22:35:22
MySQL 事務、函數、觸發器、數據庫備份、權限管理
死瘦宅
2019-02-24 22:35:12
如何釋放已刪除的InnoDB磁盤空間
lvrenX
2019-02-24 13:04:33
MySQL数据库集群-PXC方案
wy53780
2020-04-23 13:55:07
《從0到1學習Flink》—— Flink 讀取 Kafka 數據批量寫入到 MySQL
zhisheng
2019-02-24 21:04:11
SpringBoot 填坑 (一) | CentOS7.4 環境下,表時間字段默認值設置失效
一個優秀的廢人
2019-02-24 15:33:55
mysql-存儲過程
雙子城
2019-02-24 13:43:57
jmeter學習指南之操作 mysql 數據庫
小強測試
2019-02-24 13:34:06
20190222全天的實驗
清歡難尋
2019-02-24 13:17:21
數據庫監控:zabbix(fpmmm)
AMGYM
2019-02-24 13:05:14
數據庫監控:nagios(check_mysql_health)
AMGYM
2019-02-24 13:05:14
MongoDB索引優化詳解
geekpy
2019-02-24 14:20:06
Sql server中一些Select檢索高級用法
wbzjacky
2019-02-24 13:12:37
將frm,myi,myd文件打包成sql文件
jason1982
2019-02-24 12:57:22