Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中以增量插入数百万行的最快方式_Mysql_Sql_Integer - Fatal编程技术网

在MySQL中以增量插入数百万行的最快方式

在MySQL中以增量插入数百万行的最快方式,mysql,sql,integer,Mysql,Sql,Integer,我有一个带有一个bigint字段的表。现在我想以增量插入数百万行,因此我提出了以下步骤: CREATE PROCEDURE insertMe() BEGIN DECLARE i BIGINT DEFAULT 1; WHILE (i <= 999999999) DO INSERT INTO mytable values(i); SET i=i+1; END WHILE; END; 但是我该如何创建字符串呢?这不会花费太长的时间吗?在事务中运行它,这将产生相同的效果

我有一个带有一个bigint字段的表。现在我想以增量插入数百万行,因此我提出了以下步骤:

CREATE PROCEDURE insertMe()
BEGIN
 DECLARE i BIGINT DEFAULT 1;
 WHILE (i <= 999999999) DO  
   INSERT INTO mytable values(i);  
   SET i=i+1;
 END WHILE;
END;

但是我该如何创建字符串呢?这不会花费太长的时间吗?

在事务中运行它,这将产生相同的效果

CREATE PROCEDURE insertMe()
BEGIN
 DECLARE i BIGINT DEFAULT 1;
 START TRANSACTIOON;
 WHILE (i <= 999999999) DO
   INSERT INTO mytable values(i);  
   SET i=i+1;
 END WHILE;
 COMMIT;
END;

在事务中运行它,这将具有相同的效果

CREATE PROCEDURE insertMe()
BEGIN
 DECLARE i BIGINT DEFAULT 1;
 START TRANSACTIOON;
 WHILE (i <= 999999999) DO
   INSERT INTO mytable values(i);  
   SET i=i+1;
 END WHILE;
 COMMIT;
END;
您可以使用自动增量字段。如果您试图在该字段中插入空值,MySQL将为您生成自动编号,因此无需构建1、2、。。。一串尝试一下:

CREATE TABLE seed(column1 BIGINT AUTO_INCREMENT PRIMARY KEY) ENGINE=MyISAM;

-- INSERT ONE ROW TO BEGIN WITH
INSERT INTO seed(column1) VALUES(NULL);

-- RUN THIS QUERY 20 TIMES TO GENERATE 1,048,576 ROWS
INSERT INTO seed(column1)
SELECT NULL
FROM seed;
在MyISAM表上进行20次以上查询的迭代耗时约4.5秒。

您可以使用自动增量字段。如果您试图在该字段中插入空值,MySQL将为您生成自动编号,因此无需构建1、2、。。。一串尝试一下:

CREATE TABLE seed(column1 BIGINT AUTO_INCREMENT PRIMARY KEY) ENGINE=MyISAM;

-- INSERT ONE ROW TO BEGIN WITH
INSERT INTO seed(column1) VALUES(NULL);

-- RUN THIS QUERY 20 TIMES TO GENERATE 1,048,576 ROWS
INSERT INTO seed(column1)
SELECT NULL
FROM seed;

上述查询在MyISAM表上的20次迭代耗时约4.5秒。

每次调用上述查询时,插入之间都会有间隙,并且调用次数越多,间隙越大,例如1,2,3,4,6,然后7,8,9,13,然后18,19,20,28等等。在批量插入期间,InnoDB生成可能包含间隙的自动增量值。对其进行了描述。解决方案要求您更改MySQL配置,这不是一个可行的选项,因此,我建议您从MyISAM表开始,并在填充数据后将其转换为InnoDB。每次调用上面的表时,插入之间都会有一个间隙,您越频繁地调用它,间隙就越大,例如1,2,3,4,6,然后是7,8,9,13,然后是18,19,20,28等等。在批量插入期间,InnoDB生成可能包含间隙的自动增量值。对其进行了描述。解决方案要求您更改MySQL配置,这不是一个可行的选项,因此我建议您从MyISAM表开始,在填充数据后将其转换为InnoDB。