我想弄清楚为什么我们的 迁移脚本中的一个永远在使用中,我们试图执行一个更新,即 从另一个表中加入以获取相关数据片段。为什么这个MySQL更新会永远持续下去?
每个表(A,B)有大约100,000行。
# now populate the ACHIEVEMENT_INSTANCE.OBJECTIVE_INSTANCE_ID
update A a, B b
set a.INSTANCE_ID = b.INSTANCE_ID
where a.ID = b.ID;
好像我们正在处理的INNER JOIN是2个表100,000×10万门, 是永远走(大概wayyyy长)之间创造了一些 型笛卡尔乘积。
根据MySQL更新默认使用内部连接不知道我们 可以使用一些其他类型的JOIN,不会那么糟糕。
UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
的table_references子句列出参与加入 表。其 语法在第 12.2.8.1节“JOIN语法”中描述。这里是一个例子:UPDATE items,month SET items.price = month.price WHERE items.id = month.id;前面的 示例显示使用 逗号运算符的内部联接,但多表 UPDATE语句可以使用SELECT语句中允许的任何类型的 连接,例如LEFT JOIN为 。
尝试EXPLAIN query_string并发布您的结果。 – dnagirl 2009-10-20 19:09:33
你有关于a.ID和b.ID的索引吗? – Greg 2009-10-20 19:10:23
为什么被标记为sql-server? – 2009-10-20 20:05:56