MySQL“INSERT INTO SELECT NOT EXISTS”效率

时间:2018-01-16 16:45:37

标签: mysql

下面的一些代码让我头疼不已,它有效;但是只需要16k行就需要花费30分钟;最终数据库将包含1-5M行。

所以我希望提高效率

INSERT INTO r (aKey, bKey, c, d, e, fKey, g, h, i, j, k, l, mKey, nKey, o, pKey, qKey, r, sKey)
SELECT aKey, bKey, c, d, e, fKey, g, h, i, j, k, l, mKey, nKey, o, pKey, qKey, r, sKey
FROM t2
WHERE NOT EXISTS
(
    SELECT i,g
    FROM r
    WHERE t2.i = r.i AND t2.g = r.g
);

i& amp;的领域g是uniques(当前没有在DB中指定 - 它们应该是?但是要求)

任何带有Key的东西都是引用另一个表的外键

在上面的语句之后,我循环遍历每个唯一的唯一,并更新它是否不同。

UPDATE r
INNER JOIN t2 ON t2.i = r.i
SET r.d=t2.d;

我已经调查过:

INSERT ... ON DUPLICATE KEY UPDATE

但是我从未能够让它上班;因为我发现的所有例子都没有处理插入选择

任何改进SQL的建议都会非常有用。

1 个答案:

答案 0 :(得分:0)

结论是:由于请求的大小最好回到基础并“将唯一数据库字段设置为UNIQUE”然后执行INSERT IGNORE

以下代码:(包括python变量插入)

INSERT IGNORE INTO """ + tblName + """ (""" + dupeString + """)
SELECT """ + dupeString + """
FROM t2
ON DUPLICATE KEY UPDATE """ + updateString + """;

从30-40米的查询下降到......不到3秒。