[英]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.