1

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

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.

报价行:

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 报价线:247992

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

谢谢!

4

1 回答 1

0

正如 Paul 和 sceaj 在评论中指出的那样,我使用的是 LEFT join。当我删除“LEFT”时,查询会在几秒钟内运行。谢谢您的帮助!

于 2012-09-27T14:58:53.133 回答