我實際上有一個我想插入到MySQL數據庫的100,000條記錄的列表。將大量數據插入到Mysql數據庫的最快方法
我試圖用foreach
和簡單的INSERT INTO
插入它們,但是插入100行甚至花費了很多時間。像1秒/行一樣。
是否有任何方法可以更快地插入這些行?
我實際上有一個我想插入到MySQL數據庫的100,000條記錄的列表。將大量數據插入到Mysql數據庫的最快方法
我試圖用foreach
和簡單的INSERT INTO
插入它們,但是插入100行甚至花費了很多時間。像1秒/行一樣。
是否有任何方法可以更快地插入這些行?
對多行使用一個INSERT語句的速度比每行一個INSERT語句的速度快。 這將減少對數據庫的調用。
實施例:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
製作包:
INSERT INTO `table_name`(`column`) VALUES('value'),VALUES('value1'),VALUES('value2'), ..., VALUES('valuen');
或將數據導出爲CSV或其他文本格式,並使用LOAD DATA
,請看這裏:加載大型數據集load data by mysql client
最快的方法是使用散裝加載界面。 請參閱Mysql文檔:Bulk loader
使用命令行界面的最快方式。你可以使用mysqldump util。
在一個具有多個VALUES列表的長INSERT中對多個相似的INSERT進行分組,以一次插入多行:由於連接+發送+解析查詢需要5-7次實際數據插入,因此查詢將更快在行大小上)。如果這是不可能的,如果數據庫是InnoDB,則使用START TRANSACTION和COMMIT,否則使用LOCK TABLES - 這會有利於性能,因爲在完成所有INSERT語句後索引緩衝區只刷新一次;在這種情況下,每1000行左右解鎖您的表格以允許其他線程訪問表格。
(只限於MySQL)
這使得函數返回隨機的名字。你可以改變它,以適應自己
CREATE FUNCTION `get_name`() RETURNS varchar(5) CHARSET utf8
BEGIN
DECLARE chars varchar(255) default '裏對非肺喬額及愛我動物地位三次冪動物';
DECLARE str varchar(255) default '';
DECLARE i int default 0;
while i<3 do
set str=concat(str,substring(chars, FLOOR(1 + RAND()*62), 1));
set i=i+1;
END while;
RETURN str;
END
做出一個過程來實現使大量數據的
CREATE PROCEDURE `make_data`(size int)
BEGIN
declare i int default 0;
while i<size do
insert table_name(name)value(get_name());
end while;
END
呼叫make_data(1000)[完成]
如果你使用MySQL Workbench,你需要手動添加函數和過程。 如果你使用MySQL控制檯,就應該添加DELIMITER像下面
DELIMITER $$
$$
CREATE PROCEDURE `make_data`(size int)
BEGIN
declare i int default 0;
while i<size+1 do
insert table_name(name)value(get_name());
end while;
END$$
DELIMITER ;
了可以使用像phpMyAdmin或MySQL命令行界面或類似的工具(如蟾蜍)的工具數據呢? – 2013-03-18 10:36:28
其實我想將這個100,000列表添加到現有列表。因此導入不會好:/ – 2013-03-18 10:39:37
即使使用包含預先存在記錄的表,導入也可以執行插入操作。克隆你的表格結構和一些記錄(如果是一個非常大的表格)並試驗一下。 – 2013-03-18 10:41:35