mysql - 当表有索引时,LOAD DATA 的速度呈指数减慢

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

我正在使用LOAD DATA LOCAL INFILE 来填充具有以下结构的表:

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

我在 Google 云上使用 MySQL 5.7,在导入之前,我禁用 binlog 并将 innodb_flush_log_at_trx_commitunique_checksforeign_key_checks 设置为 0

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

index

IOPS 始终处于最大值。在上面的图像中,导入甚至没有完成。如果我删除所有索引,然后在导入后重新创建它们,则该图如下所示:

no-index

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

有没有办法避免手动执行此操作?我认为 LOAD DATA 应该提供最佳的性能。 InnoDB 不支持 DISABLE KEYS

最佳答案

你说你有 250M 行,这对于要求 MySQL 在单个语句中插入来说是很多。为了提高提取性能,我建议您将输入拆分为多个文件。

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

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

关于mysql - 当表有索引时,LOAD DATA 的速度呈指数减慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46707858/

相关文章:

PHP MySQL 搜索查询 - 如何在搜索 "my search"时找到类似 "mysearch"的结果?

php - 用PHPExcel制作Excel文件,每列写两次

google-cloud-platform - Cloud Composer - 未找到 DAG 任务日志文件

git - 如何对谷歌云 git repo 进行代码审查

php - 用逗号分隔列

MySQL 选择具有 sum(criteria1) <> sum(criteria2) 的行

google-app-engine - 有没有办法在 Google App Engine 中部署面向内部的应用程序?

gcloud - GCP Cloud SQL 未能删除实例,因为 `deletion_protection` 设置为 true - gcloud 切换?

kubernetes - GKE 与 gcloud sql postgres : the sidecar proxy setup does not work

java - 使用简单的 Java 程序 (JDBC) 连接到 Google SQL