Mysql中幾種插入效率的實(shí)例對(duì)比
前言
最近因?yàn)楣ぷ鞯男枰?,要在Mysql里插入大量的數(shù)據(jù)大約1000w,目測(cè)會(huì)比較耗時(shí)。所以現(xiàn)在就像測(cè)試一下到底用什么插入數(shù)據(jù)的方法比較快捷高效。
下面就針對(duì)每一種方法分別測(cè)試不同數(shù)據(jù)量下的插入效率。
測(cè)試數(shù)據(jù)庫(kù)的基本與操作如下:
mysql> create database test; Query OK, 1 row affected (0.02 sec) mysql> use test; Database changed mysql> create table mytable(id int primary key auto_increment ,value varchar(50)); Query OK, 0 rows affected (0.35 sec) mysql> desc mytable; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | value | varchar(50) | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+ 2 rows in set (0.02 sec)
方便測(cè)試,這里建了一個(gè)表,兩個(gè)字段,一個(gè)是自增的id,另一個(gè)是字符串表示內(nèi)容。
測(cè)試時(shí)每次實(shí)驗(yàn)結(jié)束都要mysql> truncate mytable
,來(lái)清空已存在的表。
方法一:逐條插入
測(cè)試代碼:(中間有1000條insert語(yǔ)句,用vim復(fù)制粘貼比較方便,寫完后保存到a.sql,然后在mysql提示符中輸入source a.sql)
set @start=(select current_timestamp(6)); insert into mytable values(null,"value"); ...... insert into mytable values(null,"value"); set @end=(select current_timestamp(6)); select @start; select @end;
輸出結(jié)果:
Query OK, 1 row affected (0.03 sec) ...... Query OK, 1 row affected (0.03 sec) Query OK, 0 rows affected (0.00 sec) +----------------------------+ | @start | +----------------------------+ | 2016-05-05 23:06:51.267029 | +----------------------------+ 1 row in set (0.00 sec) +----------------------------+ | @end | +----------------------------+ | 2016-05-05 23:07:22.831889 | +----------------------------+ 1 row in set (0.00 sec)
總共耗時(shí)31.56486s,事實(shí)上幾乎每條語(yǔ)句花的時(shí)間是差不多的,基本就是30ms。
這樣子1000w的數(shù)據(jù)就得花87h。
至于更大的數(shù)據(jù)量也就不試了,這種方法肯定不可取。
方法二:基于事務(wù)的批量插入
實(shí)際上就是把這么多的查詢放在一個(gè)事務(wù)中。事實(shí)上方法一中沒一條語(yǔ)句都開了一個(gè)事務(wù),因此才會(huì)特別慢。
測(cè)試代碼:(與方法一基本類似,主要添加兩行,由于比較快,這里測(cè)試了多種數(shù)據(jù)量)
set @start=(select current_timestamp(6)); start transaction; insert into mytable values(null,"value"); ...... insert into mytable values(null,"value"); commit; set @end=(select current_timestamp(6)); select @start; select @end;
測(cè)試結(jié)果:
數(shù)據(jù)量 時(shí)間(s) 1k 0.1458 1w 1.0793 10w 5.546006 100w 38.930997
看出來(lái)基本是對(duì)數(shù)時(shí)間,效率還是比較高的。
方法三:?jiǎn)螚l語(yǔ)句一次插入多組數(shù)據(jù)
就是一條insert一次插入多個(gè)value。
測(cè)試代碼:
insert into mytable values (null,"value"), (null,"value"), ...... (null,"value");
測(cè)試結(jié)果:
數(shù)據(jù)量 時(shí)間(s) 1k 0.15 1w 0.80 10w 2.14 100w *
看上去也是對(duì)數(shù)時(shí)間,而且比方法二要稍微快一點(diǎn)。不過問題在于單次SQL語(yǔ)句是有緩沖區(qū)大小限制的,雖然可以修改配置讓他變大,但也不能太大。所以在插入大批量的數(shù)據(jù)時(shí)也用不了。
方法四:導(dǎo)入數(shù)據(jù)文件
將數(shù)數(shù)據(jù)寫成數(shù)據(jù)文件直接導(dǎo)入(參照上一節(jié))。
數(shù)據(jù)文件(a.dat):
null value null value ..... null value null value
測(cè)試代碼:
mysql> load data local infile "a.dat" into table mytable;
測(cè)試結(jié)果:
數(shù)據(jù)量 時(shí)間(s) 1k 0.13 1w 0.75 10w 1.97 100w 6.75 1000w 58.18
時(shí)間最快,就是他了。。。。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
MySQL出現(xiàn)Waiting for table metadata lock的原因方法
在本篇內(nèi)容里小編給大家整理了MySQL出現(xiàn)Waiting for table metadata lock的原因以及解決方法對(duì)此有需要的朋友們學(xué)習(xí)下。2019-05-05安裝mysql8.0.11及修改root密碼、連接navicat for mysql的思路詳解
這篇文章主要介紹了安裝mysql8.0.11以及修改root密碼、連接navicat for mysql,需要的朋友可以參考下2018-06-06MySQL 存儲(chǔ)過程中執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法
這篇文章主要介紹了MySQL 存儲(chǔ)過程中執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法,需要的朋友可以參考下2014-08-08一文帶你理解MySql中explain結(jié)果filtered
使用EXPLAIN關(guān)鍵字可以模擬優(yōu)化器執(zhí)行SQL查詢語(yǔ)句,從而知道MySQL是如何處理你的SQL語(yǔ)句的,下面這篇文章主要給大家介紹了關(guān)于MySql中explain結(jié)果filtered的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09MySQL超詳細(xì)實(shí)現(xiàn)用戶管理實(shí)例
MySQL 是一個(gè)多用戶數(shù)據(jù)庫(kù),具有功能強(qiáng)大的訪問控制系統(tǒng),可以為不同用戶指定不同權(quán)限。在前面的章節(jié)中我們使用的是 root 用戶,該用戶是超級(jí)管理員,擁有所有權(quán)限,包括創(chuàng)建用戶、刪除用戶和修改用戶密碼等管理權(quán)限2022-06-06Mysql數(shù)據(jù)庫(kù)中數(shù)字相減 出現(xiàn)負(fù)數(shù)時(shí)sql 語(yǔ)句報(bào)錯(cuò)的問題
這篇文章主要介紹了Mysql數(shù)據(jù)庫(kù)中數(shù)字相減 出現(xiàn)負(fù)數(shù)時(shí)sql 語(yǔ)句報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05MySQL下常見的啟動(dòng)失敗與備份失敗問題的解決教程
這篇文章主要介紹了MySQL下常見的啟動(dòng)失敗與備份失敗問題的解決教程,示例環(huán)境基于Linux系統(tǒng),需要的朋友可以參考下2015-11-11MySQL函數(shù)date_format()日期格式轉(zhuǎn)換的實(shí)現(xiàn)
本文主要介紹了MySQL函數(shù)date_format()日期格式轉(zhuǎn)換的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08