当表有索引时,LOAD DATA指数减慢

时间:2017-10-12 10:56:53

标签: mysql google-cloud-platform google-cloud-sql mysql-5.7

我正在使用{{"A", "B", "C", "D"}}填充具有以下结构的表:

LOAD DATA LOCAL INFILE

我在Google云上使用MySQL 5.7,在导入之前我禁用了binlog并将CREATE TABLE `player_talent` ( `player_id` int(10) unsigned NOT NULL, `talent_id` int(10) unsigned NOT NULL, `level` tinyint(4) NOT NULL, PRIMARY KEY (`player_id`,`level`), KEY `player_talent_talent_id_foreign` (`talent_id`), CONSTRAINT `player_talent_player_id_foreign` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON DELETE CASCADE, CONSTRAINT `player_talent_talent_id_foreign` FOREIGN KEY (`talent_id`) REFERENCES `talents` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci innodb_flush_log_at_trx_commitunique_checks设置为0

以下是加载数据时使用的存储空间的样子:

index

IOPS始终处于最高位置。在上面的图像导入甚至没有完成。如果我删除所有索引,然后在导入后重新创建它们,这就是这个图形的样子:

no-index

导入阶段具有一致的线性性能。重新创建索引需要比导入更长的时间,但至少它会在合理的时间内完成。

有没有办法避免手动这样做?我认为foreign_key_checks应该提供最好的表现。 InnoDB不支持LOAD DATA

1 个答案:

答案 0 :(得分:1)

你说你有250M行,要求MySQL插入一个语句是很多的。为了提高摄取性能,我建议您将输入分成多个文件。

blogged过去关于这个问题,以及一些快捷方式,可以更轻松地将文件分成更小的部分。我会说每个文件应该是100万行或更小。

您还可以找到其他好的建议herehere来调整MySQL以提高批量导入性能。