简单的MySQL选择查询需要4个小时

时间:2013-02-04 22:32:44

标签: mysql

如果你能帮助解决一个新手问题,我将不胜感激。我应用以下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字段上有许多字段和一个索引。

该查询旨在通过T02_hesid_grouped字段中的匹配来提取hes_data_all_years中的所有记录。我希望输出提供1-2万条记录。

查询大约需要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

1 个答案:

答案 0 :(得分:0)

这可能是生成结果集或将其插入目标表时的性能问题。

通常,对于用于插入的结果集,不会SELECT *,而是将列的名称命名为与目标表中的字段相同的顺序。结果集有两列名为extract_hesid。这似乎不太可能是你想要的。

hes_data_all_years.extract_hesid中与hes_data_all_years中的行不匹配的行中T02_hesid_grouped的值是多少?如果这些值不是NULL,事情会更快。

您的桌子,特别是目的地表,是否使用MyISAM?事情将会更快,因为它们是因为InnoDB是面向事务的,并且必须生成回滚数据,同时它会对几个megarows执行INSERT。

188个megarows并不小,你的经历时间并不完全令人发指。这很长,但并非荒谬。您可能想要检查您的MySQL服务器是否有足够的RAM。或者,如果这是一年一次或一次性的事情,您可能只想宣布胜利并继续前进。