我实际上有一个包含 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
,看这里:通过mysql客户端加载数据
加载大型数据集的最快方法是使用批量加载接口。参考 Mysql 文档:Bulk loader
使用命令行界面的最快方式。您可以使用 mysqldump 实用程序。
将多个相似的 INSERT 分组到一个长 INSERT 中,并带有多个 VALUES 列表,以一次插入多行:查询会更快,因为连接 + 发送 + 解析查询需要实际数据插入的 5-7 倍(取决于行大小) . 如果这不可能,则使用 START TRANSACTION 和 COMMIT,如果您的数据库是 InnoDB,否则使用 LOCK TABLES — 这会提高性能,因为索引缓冲区仅在所有 INSERT 语句完成后刷新到磁盘一次;在这种情况下,每 1000 行左右解锁您的表,以允许其他线程访问该表。
(仅适用于 mysql)
更新:您可以使用 mysql_random_data_load
插件来制作它
这使得函数返回随机名称。你可以改变它以适合自己
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 ;