在MySql中插入唯一的1百万条记录

时间:2015-12-30 03:54:38

标签: php mysql performance

我使用PHP和MySQL在数据库中插入唯一记录。我必须插入1百万条唯一记录。

以下是我目前正在做的事情:

1)表1保存记录。 Table1只有1列已被定义为主列。最初Table1为空。

2)在PHP中生成随机数字串(RNS)(大约长度为18),例如834875609567689789

3)在表1中检查RNS。

4)如果表1中不存在,则将其插入表1和表1中。表2(对于表2,一些随机字符串,例如XYZ附加到RNS,如834875609567689789XYZ并插入表2)。

5)Table2只有1个已被定义为主要的列。

6)我在PHP中运行100 RNS的循环(在每个步骤3,4中比较1个RNS)以执行上述步骤。 100的每个循环需要20-25秒。

如何更快地完成这项工作?

2 个答案:

答案 0 :(得分:0)

您可以通过一次插入多行而不是为每个行运行新查询来加快速度。您可能必须调整PHP处理数据的方式,但如果您可以运行像这样的单个查询而不是一堆查询,那么它会更快。

insert into table (col1, col2, col3) VALUES
(val1, val2, val3),
(val1, val2, val3),
(val1, val2, val3),
(val1, val2, val3)

答案 1 :(得分:0)

首先创建一个包含新RNS值的表 - rns_list。批量插入1000.然后执行步骤3& 4集体:

一次1000行,在3个SQL中:

# Get rid of dups (very rare if you have a good random number generator)
DELETE FROM rns_list
    FROM rns_list
    JOIN table1  ON rns_list.rns = table1.rns;
# You will need an index starting with rns on table1.
# Now you have perhaps slightly less than 1000,
# so tally the count somewhere (assuming you need exactly 1 million)
# Now do the two inserts:
INSERT INTO table1  SELECT * FROM rns_list;
INSERT INTO table2  SELECT CONCAT(rns, 'XYZ') FROM rns_list;

重复直到你完成了一百万。

批处理操作(例如每个操作)通常比逐行快10倍。