确定是什么导致缓慢。
检查 JOIN 是否优化
仅运行 SELECT:
SELECT COUNT(*)
FROM xxx.product p LEFT JOIN xx.tof_art_lookup l
ON p.model_view = l.ARL_SEARCH_NUMBER;
需要多长时间?并EXPLAIN SELECT ...
检查正确INDEX
用于 JOIN。
如果 JOIN 一切正常,那么更新行很慢。这种情况很难让事情变得更快。
更新 = 删除和插入
我没有试过这个。但有时,这种策略更快...... UPDATE
是删除旧行并使用新值插入新行。
// CREATE new table and INSERT
CREATE TABLE xxx.new_product
SELECT p.model_model, l. ARL_DISPLAY_NR, ...
FROM xxx.product p LEFT JOIN xx.tof_art_lookup l
ON p.model_view = l.ARL_SEARCH_NUMBER;
// drop xxx.procuct
// rename xxx.new_product to xxx.product
将表分成小块,并发运行
我认为您的工作是受 CPU 限制的,而您的 UPDATE 查询仅使用一个 CPU 无法使多个内核受益。xxx.product TABLE 没有连接约束,有 1M 行顺序更新
我的建议如下。
给 xxx.product 一些条件,让 xxx.product 分成 20 组。(我不知道哪个专栏更适合你,因为我没有关于 xxx.product 的信息)
然后同时运行 20 个查询。
例如:
// for 1st chunk
UPDATE xxx.product AS p
...
WHERE p.model_view = l.ARL_SEARCH_NUMBER
AND p.column BETWEEN val1 AND val2; <= this condition spliting xxx.product
// for 2nd chunk
UPDATE xxx.product AS p
...
WHERE p.model_view = l.ARL_SEARCH_NUMBER
AND p.column BETWEEN val2 AND val3;
...
...
// for 20th chunk
UPDATE xxx.product AS p
...
WHERE p.model_view = l.ARL_SEARCH_NUMBER
AND p.column BETWEEN val19 AND val20;
找到 BETWEEN 值均匀分布表很重要。直方图可以帮助你。获取直方图的数据