我实际上有一个我想插入到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