【问题标题】:Inserting Unique 1 Million records in MySql在 MySql 中插入唯一的 100 万条记录
【发布时间】:2015-12-31 00:42:55
【问题描述】:

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

这是我目前正在做的事情:

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

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

3) RNS 在 Table1 中被检查。

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

5) Table2 只有 1 列被定义为主列。

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

如何更快地做到这一点?

【问题讨论】:

标签: php mysql performance


【解决方案1】:

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

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

【讨论】:

  • 我对其他问题的解决方案相同。这只能用于 Table2 插入(我可以从 100 个循环中获取唯一记录,这些记录使用 PHP 插入到 Table1 中,然后使用此方法将它们插入到 Table2 中)。但是如何先插入并检查Table1呢?
  • 如果您发布代码,我很乐意为您更改,但我不会盲目地重写整个代码
  • 基本上,创建占位符数组,而不是填充表格,填充数组。然后在底部,使用您已经处理的数据数组为每个表执行一次插入。这将您减少到三个查询。
  • 我现在正在考虑使用占位符数组。理解了这个概念。所以过程如下: 1)获取 100 个随机字符串。 2)检查表1中的每个RNS(100个查询查找)。 3) 唯一的RNS,将它们添加到Placeholder Array 1 (PA1) & Placeholder Array2 (PA2)。 4) 将 PA1 插入 Table1(1 个插入语句)。 5) 将 PA2 插入 Table2(1 条插入语句)。步骤有错误请指正。
  • 假设您的表没有无数行,那么在开始时在单个查询中选择表中的所有 rns 数字并对此进行检查会更容易和更有效。
【解决方案2】:

首先使用新的 RNS 值创建一个表 - rns_list。批量插入 1000 个。然后集体执行第 3 步和第 4 步:

在 3 个 SQL 中一次执行 1000 行:

# 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 倍。

【讨论】:

    猜你喜欢
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2012-01-02
    • 2018-11-19
    • 1970-01-01
    相关资源
    最近更新 更多