我想弄清楚爲什麼我們的 遷移腳本中的一個永遠在使用中,我們試圖執行一個更新,即 從另一個表中加入以獲取相關數據片段。爲什麼這個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