我有一个更新语句,它使用了一个需要很长时间的连接。我将在下面提供更多详细信息,但这里是查询:
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(事实上,大部分都没有)。关于如何使这个运行更快的任何提示?我最终不得不在我们的生产服务器上复制它,我不能让它花几个小时。
谢谢!