加快缓慢的更新查询

时间:2013-07-11 13:03:48

标签: mysql sql

我正在尝试使用连接更新基于另一个表的字段的字段:

UPDATE transactions
JOIN products ON products.link = transactions.product_id 
SET transactions.user_id = products.user_id
WHERE transactions.user_id != products.user_id

然而,这需要很长时间(超过15分钟)。产品有10K行,事务有大约90K行。无论如何我可以优化我的查询吗?

交易表:

id              int(11)
transaction_id  varchar(255)
user_id         int(11)
product_id      varchar(50)

产品表:

id      int(11)
user_id int(11)
link    varchar(45)

4 个答案:

答案 0 :(得分:1)

我在这里看到两个问题

  1. Products表和Transactions表通过不同大小的Varchar字段链接。这会强制查询优化器对表进行扫描(假设两者都没有编入索引)
  2. products表和transactions表都有user_id。这些ID可以不同吗?如果没有,也许这就是数据重复
  3. 让您的查询更快:

    1. 链接Identity列上的表(即Transactions表包含一个名为product_id int(11)的列,该列引用products表中的id列。这将允许您进行极快的连接

答案 1 :(得分:1)

我不确定这个sql是否可以提供帮助。你能试试吗?

update transactions as T1   
 inner join ( select T2.id , P.user_id
              from transactions as T2, projects as P
              where T2.product_id = P.link
                and T2.user_id != P.user_id
             ) as T3 on T1.id = T3.id
set T1.user_id = t3.user_id

答案 2 :(得分:0)

请尝试这个,而不是NOT EQUAL,你可以用LEFT OUTER JOIN做一个技巧

UPDATE transactions
LEFT OUTER JOIN products ON products.link = transactions.product_id AND 
transactions.user_id = products.user_id
SET transactions.user_id = products.user_id
WHERE products.user_id IS NULL AND transactions.product_id IS NULL

答案 3 :(得分:0)

创建两个索引,一个在products.link上,另一个在transactions.product_id上。

并考虑在每个索引中添加user_id作为包含字段(如果mysql支持;我主要进行SQL Server编程)。