插入大量只有数字的行

时间:2014-01-14 14:44:02

标签: php mysql performance optimization

在表中创建899行的最快方法是什么,只使用数字。该列不是自动增量。

目前我创建了一个这样的查询:

$a1=range(100,999);
$a1=implode('),(',$a1);
$a1='INSERT INTO groups (val) VALUES('.$a1.')';

它提供了一个像这样的巨大查询:

INSERT INTO groups (val) VALUES(100),(101),(102),(103),(104),(105),(106),(107),(108),
(109),(110),(111),(112),(113),(114),(115),(116),(117),(118),(119),(120),(121),(122),
(123),(124),(125), etc etc etc....

我想知道是否有更快更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

我认为你没有更快的方法。请查看 MySQL documentation

  

插入行所需的时间由以下确定   因素,数字表示大致比例:

     

连接:(3)

     

向服务器发送查询:(2)

     

解析查询:(2)

     

插入行:(1×行的大小)

     

插入索引:(1×索引数)

     

结束:(1)

     

这不考虑打开的初始开销   表,每个并发运行的查询都会执行一次。

     

表的大小减慢了log N插入索引的速度,   假设B树索引。

     

您可以使用以下方法加速插入:

     

如果您同时从同一客户端插入多行,   使用带有多个VALUES列表的INSERT语句来插入多个   一次排。这要快得多(在某些情况下要快很多倍)   case)比使用单独的单行INSERT语句。如果你是   将数据添加到非空表,您可以调整   bulk_insert_buffer_size变量使数据插入更快。   请参见第5.1.4节“服务器系统变量”。

通过一个查询,您可以保存ConnectingSending query to serverClosing,以及MySQL优化您的查询。

另外,如果您只插入大约1000行且数据如此之少,那么插入速度非常快,因此在这种情况下我不会担心性能。

答案 1 :(得分:0)

对于一系列数字,如果需要,可以使用较小的查询: -

INSERT INTO groups (val)
SELECT Hundreds.a * 100 + Tens.a * 10 + Units.a AS aNumber
FROM
(SELECT 0 AS a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Hundreds,
(SELECT 0 AS a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Tens,
(SELECT 0 AS a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Units
HAVING aNumber BETWEEN 100 AND 999

不确定这会为你节省多少。