5

我实际上有一个包含 100,000 条记录的列表,我想将它们插入 MySQL 数据库。

我试图用foreach简单的方式插入它们,INSERT INTO但是插入甚至 100 行都需要很多时间。像 1 秒 / 行。

有什么方法可以更快地插入这些行吗?

4

6 回答 6

15

对多行使用一个 INSERT 语句比每行一个 INSERT 语句要快。这将减少对数据库的调用。

例子:

 INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
于 2013-03-18T10:49:01.847 回答
5

制作包:

INSERT INTO `table_name`(`column`) VALUES('value'),VALUES('value1'),VALUES('value2'), ..., VALUES('valuen');

插入文档

或将数据导出为csv或其他文本格式并使用LOAD DATA,看这里:通过mysql客户端加载数据

于 2013-03-18T10:39:23.263 回答
0

加载大型数据集的最快方法是使用批量加载接口。参考 Mysql 文档:Bulk loader

于 2013-03-18T10:40:27.400 回答
0

使用命令行界面的最快方式。您可以使用 mysqldump 实用程序。

于 2013-03-18T10:51:21.443 回答
0

将多个相似的 INSERT 分组到一个长 INSERT 中,并带有多个 VALUES 列表,以一次插入多行:查询会更快,因为连接 + 发送 + 解析查询需要实际数据插入的 5-7 倍(取决于行大小) . 如果这不可能,则使用 START TRANSACTION 和 COMMIT,如果您的数据库是 InnoDB,否则使用 LOCK TABLES — 这会提高性能,因为索引缓冲区仅在所有 INSERT 语句完成后刷新到磁盘一次;在这种情况下,每 1000 行左右解锁您的表,以允许其他线程访问该表。

来自这篇文章:http ://www.ajaxline.com/node/2099

于 2013-03-18T11:00:46.843 回答
-1

(仅适用于 mysql)

更新:您可以使用 mysql_random_data_load
插件来制作它

github链接点击这里


这使得函数返回随机名称。你可以改变它以适合自己

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 ;
于 2017-09-14T13:45:04.300 回答