将海量数据插入Mysql数据库的最快方法

时间:2013-03-18 10:33:17

标签: php mysql

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

我尝试使用foreach和简单INSERT INTO插入它们,但是插入甚至100行需要花费大量时间。像1秒/行。

是否有任何方法可以更快地插入这些行?

6 个答案:

答案 0 :(得分:15)

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

示例:

 INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

答案 1 :(得分:5)

制作套餐:

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

documentation for insert

或将数据导出为csv或其他文字格式并使用LOAD DATA,请点击此处:load data by mysql client

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使用命令行界面的最快方法。你可以使用mysqldump util。

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)

(仅适用于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 ;