2013-01-15 57 views
0

我有2個mysql表,其中一個在另一個表中有一個外鍵。當mysqldump使用where語句選擇性地轉儲某些子集時,第二個mysqldump進入準備狀態並永久掛起。我該如何解決?mysqldump掛起

 
mysqldump -u$username -p$password --quick --lock-all-tables --where="table1_id<1000" $db table1 > $dump_dir/table1.sql                         

mysqldump -u$username -p$password --quick --lock-all-tables --where="table2_id in (select table2_id from table1 where table1_id<1000)" $db table2 >$dump_dir/table2.sql 

回答

0

這裏有幾件事情你可以試試。

嘗試添加索引:

... ON table1 (table1_id, table2_id) 

另外,嘗試在子查詢中添加DISTINCT關鍵字:

table2_id in (select DISTINCT table2_id from table1 where table1_id<1000) 

比MySQL正在使用的查詢性能的其他,我不看到有什麼應該導致「掛起」,除了那lock-all-tables選項。我假設你沒有測試過,並觀察到相同的行爲。


問:你有什麼懷疑導致掛?

我懷疑這只是啓動的SELECT語句。我認爲很可能對於table2中的每一行,執行計劃都是從table1進行嵌套循環查找。我懷疑IN (subquery)謂詞正在被優化成等效的EXISTS (correlated subquery)

問:爲什麼要添加索引有幫助?

索引可能根本沒有幫助。但是table1上的適當索引可能會減少從子查詢中檢索結果所需的時間。 (很可能子查詢的結果將被「緩存」,因此只有在子查詢第一次運行時纔會節省,並且不會節省table2中每行的存儲空間)

+0

我試過不同的它沒有幫助。爲什麼要添加索引幫助?你懷疑是什麼造成了這個懸掛? – user121196

+0

IN(子查詢)正在導致掛起,因爲mysql一遍又一遍地重新執行子查詢。 – user121196