1

如果您能帮助解决一个新手问题,我将不胜感激。我应用以下 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
4

1 回答 1

0

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

通常不会对SELECT *用于插入的结果集执行此操作,而是按与目标表中的字段相同的顺序命名要选择的列。您的结果集有两列名为 extract_hesid. 这似乎不太可能是你想要的。

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

您的表,尤其是目标表,是否使用 MyISAM?如果是这样的话,事情会更快,因为 InnoDB 是面向事务的,并且在执行几兆行的 INSERT 时必须生成回滚数据。

188 兆行并不小,而且您经过的时间也不是完全离谱。它很长,但并不荒谬。您可能需要检查您的 MySQL 服务器是否有足够的 RAM。或者,如果这是一年一次或一次,您可能只想宣布胜利并继续前进。

于 2013-02-04T23:36:38.577 回答