mysql快速插入大量數(shù)據(jù)的正確方法
前言
最近做性能測(cè)試,需要模擬生產(chǎn)環(huán)境的數(shù)據(jù)量,在造百萬(wàn)、千萬(wàn)級(jí)數(shù)據(jù)的時(shí)候發(fā)現(xiàn)直接使用插入sql效率極低,百度了一翻,找到幾種方式,但用下來(lái)還是有很快速的方式,推薦第四種
插入mysql數(shù)據(jù)效率對(duì)比
1.單行插入
insert into tableName (colunm1,colunm2,...) value(value1,value2,...);
沒(méi)錯(cuò),很普通的一條sql,插入速度也很普通,不推薦
2.多行插入
insert into tableName(colunm1,colunm2,..) values(value1,value2...),(value1,value2...);
有點(diǎn)點(diǎn)進(jìn)度,但是不多,多行插入可以減少插入數(shù)據(jù)時(shí)的IO和網(wǎng)絡(luò)開(kāi)銷,從而加快插入數(shù)據(jù)的速度。此方法適用于插入少量數(shù)據(jù)的情況,當(dāng)插入數(shù)據(jù)量變大時(shí),數(shù)據(jù)庫(kù)連接可能會(huì)被打滿
3.批量插入
INSERT INTO table_name (column1, column2, column3) VALUES (value1, value2, value3), (value4, value5, value6), ...... ON DUPLICATE KEY UPDATE column1=VALUES(column1), column2=VALUES(column2), column3=VALUES(column3);
這個(gè)操作將所有插入放在一個(gè)事務(wù)中,并將其視為一個(gè)操作。此方法使用一次SQL查詢來(lái)插入大量數(shù)據(jù),因此減少了IO和網(wǎng)絡(luò)開(kāi)銷
4.使用LOAD DATA INFILE語(yǔ)句
LOAD DATA INFILE 'file_name' INTO TABLE table_name FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
使用LOAD DATA INFILE語(yǔ)句可以將大量的數(shù)據(jù)快速地導(dǎo)入MySQL中。此方法適用于數(shù)據(jù)已存儲(chǔ)在文件中的情況,您只需指定文件名和目標(biāo)表即可導(dǎo)入數(shù)據(jù)。而且,此方法支持多線程操作,可在不阻塞數(shù)據(jù)庫(kù)的同時(shí)并行地導(dǎo)入數(shù)據(jù)
說(shuō)實(shí)話,這種方式非常香,親測(cè)500W數(shù)據(jù)1分鐘插入完成,推薦file_name: 本地存儲(chǔ)數(shù)據(jù)的文件
這個(gè)文件的數(shù)據(jù)需要先準(zhǔn)備好,你也可以選擇像我一樣代碼生成
- 首先,從數(shù)據(jù)庫(kù)復(fù)制一條數(shù)據(jù)
- 然后把復(fù)制出來(lái)的插入sql中value里的內(nèi)容摳出來(lái)
- 摳出來(lái)的內(nèi)容注意下是否有外鍵、主鍵,如果有要處理一下扣出來(lái)的內(nèi)容,下面的例子是id是主鍵,我給去掉了,然后循環(huán)生成主鍵拼接上去,循環(huán)生成的值要符合數(shù)據(jù)庫(kù)的字段定義類型
data = ",860272,'2023-07-26 18:00:03','2023-07-26 18:00:03',1,未完成,時(shí),1,1時(shí),219,85,1,001-001,0,9784,'2023-07-26 18:00:03',9784,'2023-07-26 18:00:03'" with open('demo.txt', 'w+', encoding='utf-8') as f: for i in range(0, 1000000): f.write(str(i + 1) + data + '\n')
- 執(zhí)行后生成demo.txt文件,每一行不同的值逗號(hào)分隔
- 最后,連接數(shù)據(jù)庫(kù),可以使用命令連接,也可以借助工具連接,執(zhí)行命令
LOAD DATA LOCAL INFILE 'E:\\demo.txt' INTO TABLE 表名 FIELDS TERMINATED BY ',' ('列名1','列名2','列名3','列名4')
注意:你的txt的值要跟命令中的列名對(duì)應(yīng)上,如果你是全字段的值插入,那么('列名1','列名2','列名3','列名4')
可以省略不寫
好了,可以享受插入數(shù)據(jù)的快樂(lè)了…
總結(jié)
到此這篇關(guān)于mysql快速插入大量數(shù)據(jù)的正確方法的文章就介紹到這了,更多相關(guān)mysql快速插入大量數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL 4.1/5.0/5.1/5.5/5.6各版本的主要區(qū)別整理
這篇文章主要介紹了MySQL 4.1/5.0/5.1/5.5/5.6各版本的主要區(qū)別整理,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-08-08MySQL redo死鎖問(wèn)題排查及解決過(guò)程分析
被告知在多實(shí)例場(chǎng)景下 MySQL Server hang 住,無(wú)法測(cè)試下去,原生版本不存在這個(gè)問(wèn)題,而新版本上出現(xiàn)了這個(gè)問(wèn)題,不禁心頭一顫,心中不禁感到奇怪,還好現(xiàn)場(chǎng)環(huán)境還在,為排查問(wèn)題提供了一個(gè)好的環(huán)境,隨即便投入到緊張的問(wèn)題排查過(guò)程當(dāng)中2016-10-10解決MySql不等于的條件過(guò)濾字段值為NULL問(wèn)題
今天遇到一個(gè)查詢結(jié)果不對(duì)的問(wèn)題,使用isNull能解決問(wèn)題,但因查詢條件過(guò)濾null,還有不同的寫法,總結(jié)了兩種實(shí)現(xiàn)方式,希望能給大家一個(gè)參考2024-12-12MySQL5.6.31 winx64.zip 安裝配置教程詳解
這篇文章主要介紹了MySQL5.6.31 winx64.zip 安裝配置教程詳解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02避免MySQL中的隱式轉(zhuǎn)換的方法小結(jié)
在 MySQL 中,隱式轉(zhuǎn)換可能導(dǎo)致索引失效、結(jié)果不符合預(yù)期或性能問(wèn)題,以下是避免隱式轉(zhuǎn)換的具體方法,從表設(shè)計(jì)、查詢編寫到配置優(yōu)化,逐步減少隱式轉(zhuǎn)換的發(fā)生,具體操作過(guò)程跟隨小編一起看看吧2025-04-04