簡體   English   中英

簡單的MySQL選擇查詢需要4個小時

[英]Simple MySQL select query takes 4 hours

如有新手幫助,我將不勝感激。 我應用以下SQL:

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表具有1.88億條記錄,而T02_hesid_grouped表具有80,000條記錄。 T02_hesid_grouped表具有一個名為extract_hesid的單個(唯一)字段,該字段已建立索引。 hes_data_all_years具有許多字段,並且正在聯接的extract_hesid字段上有一個索引。

該查詢旨在提取hes_data_all_years中的所有記錄,並在T02_hesid_grouped字段中匹配。 我希望輸出提供1-2m條記錄。

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

時間的長短是由於數據集的大小引起的,還是可以進行一些優化? 非常感謝!!

SELECT部分​​的EXPLAIN輸出如下所示:

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

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

通常,對於要用於插入的結果集,不執行SELECT * ,而是以與目標表中的字段相同的順序命名要選擇的列。 您的結果集中有兩列名為extract_hesid 看來這不是您想要的。

什么是價值hes_data_all_years.extract_hesid的行中hes_data_all_years不匹配中的行T02_hesid_grouped 如果這些值不為NULL,事情將會更快。

您的表(尤其是目標表)是否使用MyISAM? 如果這樣做是因為InnoDB是面向事務的,並且必須在執行INSERT數百萬行的同時生成回滾數據,那么事情將會更快。

188兆行並不小,您經過的時間也不盡人意。 這很長,但並非荒唐。 您可能要檢查您的MySQL服務器是否有足夠的RAM。 或者,如果這是一年一次或一次的事情,那么您可能只想簡單地宣布勝利並繼續前進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM