在MYSQL表中插入1亿条记录时出错

时间:2014-10-15 13:41:02

标签: mysql database mysql-error-1064 mysqldatareader

我的表Temp_load包含列:

key bigint(19) UN PK 
plane_key bigint(20) PK 
locat_key bigint(20) PK 
time_period_key bigint(19) UN PK 
business_unit_key bigint(19) UN 
curret_allocated tinyint(1) 
value float 
valid_ind int(11) 
last_updated datetime

上面是Temp_load表中包含的列。

我正在尝试使用以下查询

将数据插入此表
INSERT INTO <Schema_name>.`Temp_load` 
            (key, 
             plane_key, 
             locat_key, 
             time_period_key, 
             business_unit_key, 
             curret_allocated, 
             value) 
(SELECT DISTINCT 1, 
                 plane_key, 
                 locat_key, 
                 1, 
                 CASE 
                   WHEN current_area = 'HEALTH' THEN 1 
                   WHEN current_area = 'BEAUTY/PERSONAL' THEN 3 
                   WHEN current_area = 'GM' THEN 2 
                   WHEN current_area = 'CONSUMABLES' THEN 4 
                 end, 
                 current_flag, 
                 opt_metric_1 
 FROM   staging.curves
 WHERE  opt_metric_1 IS NOT NULL 
        AND current_area IS NOT NULL); 

Source表中有2900万条记录。上面的插入语句运行超过5个小时仍在运行。 我在同一张桌子上一次性插入2900万个插件,我需要在不同的列上插入3倍以上。

当我尝试使用LOAD DATA INFILE加载时,它会抛出ERROR 1205(HY000):超出锁定等待超时;尝试重新启动事务 我也尝试将innodb_lock_wait_timeout增加到120,但我们仍然面临着这个问题。

在加载之前,我也禁用了旗帜。

SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;

我们还有其他最佳解决方案吗?插入可以更快的方式完成。

由于

1 个答案:

答案 0 :(得分:0)

问题可能是检查要插入的每一行的PRIMARY KEY完整性。您应该在插入数据之前删除PK。在MariaDB中,您可以禁用其中一些检查,但我也不知道MySQL是否也可以。

替代方案可能是UNION Temp_loadstaging.curves到另一个表格中:

CREATE TABLE myNewTable 
SELECT ... FROM Temp_load
UNION
SELECT ... FROM staging.curves