我有一个更新声明,使用的连接需要很长时间。我将在下面提供更多详细信息,但这里是查询:
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(事实上,大多数引号都没有)。有关如何使这种运行更快的任何提示?我最终不得不在我们的生产服务器上复制它,我不能花费数小时。
谢谢!
答案 0 :(得分:0)
正如Paul和sceaj的评论所指出的,我正在使用LEFT加入。当我删除'LEFT'时,查询会在几秒钟内完成。谢谢你的帮助!