MySQL:使用连接进行更新需要很长时间

时间:2012-09-26 22:10:35

标签: mysql join

我有一个更新声明,使用的连接需要很长时间。我将在下面提供更多详细信息,但这里是查询:

update quote_line
left join quote q on (q.id = quote_id and q.version = version )
set quote_serial_id = q.serial_id

背景故事:我正在尝试清理我继承的数据库。我有两个表具有以下模式(仅显示重要的列):

报价:

serial_id  bigint(20)  -- Unique key defined with 'serial'
id         bigint(20)  -- Id of quote.
version    smallint(6) -- Version of quote.

quote_line:

id         bigint(20)  -- Unique key defined with 'serial'
quote_id   bigint(20)  -- Foreign key to quote.
version    smallint(6) -- Foreign key to quote.

请注意,quote.id 不是一个键,但是quote.id + quote.version是。无论出于何种原因,设计人员决定使用id + version作为quote_line中的外键而不是serial_id。为了使这里具体化,连接必须如何完成:

select q.id, q.version, q.serial_id
from quote q join quote_line l on q.id = l.quote_id and l.version = q.version

我想更改quote_line中的FK以使用quote.serial_id,它为我提供了此更新声明:

update quote_line
left join quote q on (q.id = quote_id and q.version = version )
set quote_serial_id = q.serial_id

此声明在运行数小时后仍未完成。我试过在没有改进的情况下创建索引。我正在运行MySQL 5.5.14所以我无法对更新运行解释。这两个表有很多行:

引用:335517 quote_line:247992

你可以看到并非所有引号都有quote_lines(事实上,大多数引号都没有)。有关如何使这种运行更快的任何提示?我最终不得不在我们的生产服务器上复制它,我不能花费数小时。

谢谢!

1 个答案:

答案 0 :(得分:0)

正如Paul和sceaj的评论所指出的,我正在使用LEFT加入。当我删除'LEFT'时,查询会在几秒钟内完成。谢谢你的帮助!