MySQL批量插入大量数据方法
在MySQL數(shù)據(jù)庫中,如果要插入上百萬級的記錄,用普通的
insert into
來操作非常不現(xiàn)實(shí),速度慢人力成本高,推薦使用
Load Data
或存儲過程來導(dǎo)入數(shù)據(jù),我總結(jié)了一些方法分享如下,主要基于MyISAM和InnoDB引擎。
InnoDB存儲引擎
首先創(chuàng)建數(shù)據(jù)表(可選),如果有了略過:
> CREATE DATABASE ecommerce; > USE ecommerce; > CREATE TABLE employees (id INT NOT NULL,fname VARCHAR(30),lname VARCHAR(30),birth TIMESTAMP,hired DATE NOT NULL DEFAULT '1970-01-01',separated DATE NOT NULL DEFAULT '9999-12-31',job_code INT NOT NULL,store_id INT NOT NULL)partition BY RANGE (store_id) (partition p0 VALUES LESS THAN (10000),partition p1 VALUES LESS THAN (50000),partition p2 VALUES LESS THAN (100000),partition p3 VALUES LESS THAN (150000),Partition p4 VALUES LESS THAN MAXVALUE);然后創(chuàng)建存儲過程,其中,
delimiter
命令用來把語句定界符從
;
變?yōu)?br /> //
,不然到
declare var int;
遇上第一個分號MySQL就錯誤停止:
MyISAM存儲引擎
首先創(chuàng)建數(shù)據(jù)表(可選):
use ecommerce;
CREATE TABLE ecommerce.customer (
id INT NOT NULL,
email VARCHAR(64) NOT NULL,
name VARCHAR(32) NOT NULL,
password VARCHAR(32) NOT NULL,
phone VARCHAR(13),
birth DATE,
sex INT(1),
avatar BLOB,
address VARCHAR(64),
regtime DATETIME,
lastip VARCHAR(15),
modifytime TIMESTAMP NOT NULL,
PRIMARY KEY (id)
) ENGINE = MyISAM ROW_FORMAT = DEFAULT
partition BY RANGE (id) (
partition p0 VALUES LESS THAN (100000),
partition p1 VALUES LESS THAN (500000),
partition p2 VALUES LESS THAN (1000000),
partition p3 VALUES LESS THAN (1500000),
partition p4 VALUES LESS THAN (2000000),
Partition p5 VALUES LESS THAN MAXVALUE
);
再創(chuàng)建存儲過程:
ALTER TABLE ecommerce ENGINE = MYISAM;
關(guān)于批量插入
提高數(shù)據(jù)插入效率的基本原則如下:
批量插入數(shù)據(jù)的效率比單數(shù)據(jù)行插入的效率高
插入無索引的數(shù)據(jù)表比插入有索引的數(shù)據(jù)表快一些
較短的SQL語句的數(shù)據(jù)插入比較長的語句快
這些因素有些看上去是微不足道的,但是如果插入大量的數(shù)據(jù),即使很小的影響效率的因素也會形成不同的結(jié)果。根據(jù)上面討論的規(guī)則,我們可以就如何快速地加載數(shù)據(jù)得出幾個實(shí)用的結(jié)論。
使用
LOAD DATA
語句要比
INSERT
語句效率高,因?yàn)樗坎迦霐?shù)據(jù)行。服務(wù)器只需要對一個語句(而不是多個語句)進(jìn)行語法分析和解釋。
索引只有在所有數(shù)據(jù)行處理完之后才需要刷新,而不是每處理一行都刷新。
如果你只能使用
INSERT
語句,那就要使用將多個數(shù)據(jù)行在一個語句中給出的格式:
INSERT INTO table_name VALUES(…),(…),…
,這將會減少你需要的語句總數(shù),最大程度地減少了索引刷新的次數(shù)。
根據(jù)上面的結(jié)論,今天又對相同的數(shù)據(jù)和數(shù)據(jù)表進(jìn)行了測試,發(fā)現(xiàn)用
LOAD DATA
速度快了不只是一點(diǎn)點(diǎn),竟然只用了十多分鐘!所以在MySQL需要快速插入大量數(shù)據(jù)時,
LOAD DATA
是你不二的選擇。
順便說一下,在默認(rèn)情況下,
LOAD DATA
語句將假設(shè)各數(shù)據(jù)列的值以制表符(t)分隔,各數(shù)據(jù)行以換行符(n)分隔,數(shù)據(jù)值的排列順序與各數(shù)據(jù)列在數(shù)據(jù)表里的先后順序一致。但你完全可以用它來讀取其他格式的數(shù)據(jù)文件或者按其他順序來讀取各數(shù)據(jù)列的值,有關(guān)細(xì)節(jié)請參照MySQL文檔。
總結(jié)
對于Myisam類型的表,可以通過以下方式快速的導(dǎo)入大量的數(shù)據(jù)。
ALTER TABLE tblname DISABLE KEYS; loading the data ALTER TABLE
tblname ENABLE KEYS;
這兩個命令用來打開或者關(guān)閉MyISAM表非唯一索引的更新。在導(dǎo)入大量的數(shù)據(jù)到一個非空的MyISAM表時,通過設(shè)置這兩個命令,可以提高導(dǎo)入的效率。對于導(dǎo)入大量
數(shù)據(jù)到一個空的MyISAM表,默認(rèn)就是先導(dǎo)入數(shù)據(jù)然后才創(chuàng)建索引的,所以不用進(jìn)行 設(shè)置。
總結(jié)
以上是生活随笔為你收集整理的MySQL批量插入大量数据方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PLC与继电器
- 下一篇: 50个找文献资料的中外全球电子数据库【收