2013-02-04 33 views
1

如果你可以幫助一個新手問題,我將不勝感激。我申請的SQL語句:簡單的MySQL選擇查詢需要4小時

INSERT INTO t03_hesid_history(uniqueID, hes_data_all_years.extract_hesid, FIELD1, FIELD2) 
SELECT uniqueID, hes_data_all_years.extract_hesid, FIELD1, FIELD2 
FROM hes_data_all_years 
INNER JOIN T02_hesid_grouped 
ON hes_data_all_years.extract_hesid = T02_hesid_grouped.extract_hesid; 

的hes_data_all_years表擁有188萬條記錄和T02_hesid_grouped臺擁有8條記錄。 T02_hesid_grouped表具有一個名爲extract_hesid的單個(唯一)字段,該字段被索引。 hes_data_all_years在正在連接的extract_hesid字段上有許多字段和一個索引。

該查詢旨在提取heles_data_all_years中的所有記錄,並在T02_hesid_grouped字段中進行匹配。我期望輸出提供1-2米的記錄。

的查詢需要大約4小時...

是時間的長短因數據集大小或是否有可能進行一些優化?非常感謝!!

EXPLAIN outputon如下所示SELECT部分​​:

1 SIMPLE T02_hesid_grouped index I_HESID I_HESID 43  79824 Using index 
1 SIMPLE hes_data_all_years ref I_HESID I_HESID 43 hes.T02_hesid_grouped.extract_hesid 1 Using where 
+2

請發佈查詢的選擇部分的'EXPLAIN'。 't03_hesid_history'是否有索引? –

+0

謝謝 - 我已經添加了EXPLAIN輸出 – user2041216

回答

0

這可能是與生成結果集或將其插入到目標表中的性能問題。

對於用於插入的結果集,通常不會執行SELECT *,而是將列指定爲按照與目標表中的字段相同的順序進行選擇。您的結果集有兩列,名稱分別爲extract_hesid。這似乎不太可能是你想要的。

hes_data_all_years.extract_hesid對於hes_data_all_years中與T02_hesid_grouped中的行不匹配的行的值是什麼?如果這些值不是NULL,情況會更快。

您的表格,特別是目標表格是否使用MyISAM?如果它們是因爲InnoDB是面向事務的,並且必須在執行一些插入操作時生成回滾數據,情況會更快。

188塊不算小,你的流逝時間並不完全是離譜的。這很漫長,但並不荒謬。你可能想檢查你的MySQL服務器是否有足夠的RAM。或者,如果這是一年一次或一次性的事情,您可能只需宣佈勝利並繼續前進。

+0

非常感謝您的回覆。我已經稍微調整了一下我的代碼(我把*放在我的文章中簡潔明瞭,但現在已經提醒了我)。要回答您的問題,hes_data_all_years.extract_hesid中沒有與T02_hesid_grouped中的行不匹配的值。另外,我正在使用InnoDB ... – user2041216