0

所以我有一个巨大的更新,我必须将大约 40gb 的数据插入到一个 innodb 表中。它需要很长时间,所以我想知道哪种方法最快(更重要的是为什么,因为我可以做一个拆分测试)。

方法1)

a) 插入所有行 b) 创建 ALTER TABLE su_tmp_matches ADD PRIMARY KEY ( id )

方法2)

a) ALTER TABLE su_tmp_matches ADD PRIMARY KEY (id) b) 插入所有行

目前我们正在使用方法 1,但步骤 b) 似乎需要大量时间。所以我想知道这里的大小是否有任何含义(40gb - 500 万行)。

---- 所以我决定也对此进行测试 --- 非常快的全新 mysql 服务器 - 加载和加载 ram,以及快速 ram,快速磁盘,并且非常调整(我们每秒有超过 5000 个请求一件):

1,6 mio 行/6gb 数据:

81 秒“删除”主索引

“添加”主索引需要 550 秒(添加数据后)

120秒用主索引创建表的副本 create BEFORE data insert

创建没有主索引的表副本需要 80 秒(之后创建需要 550 秒)

似乎很荒谬 - 问题是,如果索引是同一件事。

4

1 回答 1

3

文档中

InnoDB 没有像 MyISAM 存储引擎那样对单独的索引创建进行特殊优化。因此,导出和导入表并随后创建索引是不值得的。将表更改为 InnoDB 的最快方法是直接对 InnoDB 表进行插入。

在我看来,如果您的列具有主键是一个自动递增的整数,那么在插入之前添加唯一性约束只能帮助引擎。但我真的怀疑会有显着差异。

一个有用的建议:

在大表转换过程中,增加 InnoDB 缓冲池的大小以减少磁盘 I/O,最大为物理内存的 80%。您还可以增加 InnoDB 日志文件的大小。

编辑:根据经验,MySQL 并不总是按照文档性能方面的预期执行,我认为你在这方面所做的任何基准测试都会很有趣,即使本身不是一个明确的答案。

于 2012-06-20T14:05:28.863 回答