【发布时间】:2017-11-24 09:23:47
【问题描述】:
我环顾四周并尝试了不同的方法,并希望改进我的大数据导入机制。在插入时导入数据效果很好,但是当我想根据 2 个 where 语句更新现有数据时遇到了问题。
我首先从源加载数据并将其放置在 CSV 文件中,然后使用 LOAD DATA LOCAL INFILE 将数据导入临时表中。
比从临时表插入到主表中,它按预期工作。速度快,使用的服务器资源少。
INSERT INTO $table ($fields) SELECT $fields FROM $temptable WHERE (ua,gm_id) NOT IN (SELECT ua,gm_id FROM $table)
我有以下更新记录,我创建此方法的原因是因为重复键的更新不起作用。因为它总是插入一条新记录。我想我不明白这种方法是如何工作的,或者没有以正确的方式使用它。 UA 和 GM_ID 都是两个表上的索引,但不能让它工作。以下脚本的问题是,如果我更新 8000 行,它会使用 200% 的 CPU 并需要 5 到 8 分钟。这当然不是很好。
$query = "UPDATE $table a INNER JOIN $temptable b ON a.gm_id=b.gm_id AND a.ua=b.ua SET ";
foreach($update_columns as $column => $status){
$query .= "a.$column=b.$column,";
}
$query = trim($query, ",");
$result = $pdo->query($query);
谁能指出我应该使用的正确方向。
我想将临时表中的某些列更新到主表。此代码在一天中执行分配的时间。有时只能更新 100 行,但有时可以更新 8k 或 60k 行,并且列可以更改。
希望示例代码清晰。
提前感谢您的帮助。
【问题讨论】:
-
key相同的情况下,为什么要用其中一个更新非key列,只保留第一个插入的记录,忽略其他的,也许也合适。
-
@Forward 因为两列中的键不一样。并且只能根据 ua 和 gm_id 要求进行更新。
-
@zuluk 我无法删除原始记录,因为它包含需要保留的值,这些值不存在于 temptable 中。因此,为什么只能更新某些列。
-
有时在更新之前删除索引并在之后重新创建它会更有效。这取决于您的数据。
-
也许您可以为 id-columns 采用更有效的数据类型:
SELECT gm_id FROM table1 PROCEDURE ANALYSE();