1

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

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

4 回答 4

1

我在这里看到两个问题

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

为了使您的查询更快:

  1. 链接 Identity 列上的表(即 Transactions 表包含一个名为 product_id int(11) 的列,它引用 products 表中的 id 列。这将允许您进行非常快速的连接
于 2013-07-11T13:11:07.230 回答
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
于 2013-07-11T13:33:23.410 回答
0

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

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

于 2013-07-11T13:16:35.493 回答
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
于 2013-07-11T13:10:17.413 回答