更新语句上的MySQL查询速度慢

时间:2013-11-12 12:18:58

标签: mysql sql performance

我正在尝试将一些数据从数据库移动到另一个数据库。我目前在我的数据库中有超过一百万个条目,我期待这需要很长时间,但已经过了50分钟,没有结果:)。 这是我的疑问:

UPDATE xxx.product AS p 
LEFT JOIN xx.tof_art_lookup AS l ON p.model_view = l.ARL_SEARCH_NUMBER 
SET p.model = l.ARL_DISPLAY_NR 
WHERE p.model_view = l.ARL_SEARCH_NUMBER;

欢迎任何有关如何改进此查询的帮助。提前谢谢!

2 个答案:

答案 0 :(得分:2)

p.model_view上的索引,如果你不想摆脱JOIN,那么l.ARL_SEARCH_NUMBER。
实际上,可以根据实际数据量及其值(NULL存在)进行优化,使用:
1.监视查询执行计划,如果不好,则为编译器提供查询提示或为子查询交换JOIN,以便编译器在其中使用其他类型的连接(merge / nested loops / hashs / whatever)
2.使存储过程具有更复杂但更快的逻辑 3.按小部分进行更新

答案 1 :(得分:1)

找出缓慢的原因。

检查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的一切正常,那么UPDATEING行很慢。这种情况很难让事情变得更快。

UPDATE = DELETE AND INSERT

我没试过这个。但有时候,这个策略更快.. UPDATE是DELETE旧行,使用新值INSERT新行。

// 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值分配表。直方图可以帮助你。 Getting data for histogram plot