MySQL alter table启用密钥的速度不如承诺的那么快

5 mysql sql database

所以我有一个大表,有超过20亿条记录和5个多列密钥.

我可以使用两种方法插入数据:

方法1

load data infile ...;
Run Code Online (Sandbox Code Playgroud)

方法2

alter table disable keys;
load data infile ...;
alter table enable keys;
Run Code Online (Sandbox Code Playgroud)

如果我从空表开始,对于20亿条记录,方法1需要大约60小时(估计,可能更多),而方法2需要12小时来插入数据,3小时重新创建密钥.到现在为止还挺好.

但是,如果我已经拥有20亿条记录,并尝试再插入500万条记录,则方法1需要大约3小时,而方法2需要30分钟插入数据,并且需要7个小时才能重新创建密钥.我确认在整个钥匙再生期间,它使用了Repair by sorting,所以它不像它倒退了Repair with keycache.

我想知道为什么会这样.MySQL声称禁用密钥非常适合插入批量数据,但这显然取决于上下文.如果要从头开始重新生成所有键,为什么不需要大约3个小时,就像我开始使用空表一样?或者如果它逐个插入密钥,为什么不花费大约3个小时,这是方法1所花费的?

欢迎评论

Pis*_*3.0 0

“没有承诺的那么快” - 呃,你有 5000000 条记录,当然这比插入 20 条记录要长一点

  • 使用第一种方法,它在每行插入时稍微更改索引,因此它们始终与数据一致。
  • 使用第二种方法,它通过对整个表(2005000000 行)进行排序来重建索引- 这意味着它会来回移动大量现有索引数据(磁盘速度可能会成为这里的瓶颈),这取决于1) 现有数据量,2) 新数据量。
  • 您可以使用方法 3:在第二次插入之前删除键(这也可能需要一些时间),然后重新创建它们。我怀疑时间与初次插入后重新创建密钥的时间相似

恕我直言,您描述的速度非常合理 - 只需使用最快的方法即可。

  • 我从未声称它应该很快,我只是说它没有宣传的那么快。MySQL 的文档说“ALTER TABLE ... DISABLE KEYS 告诉 MySQL 停止更新非唯一索引。然后应该使用 ALTER TABLE ... ENABLE KEYS 来重新创建*丢失的*索引。MySQL 使用一种更快的特殊算法来做到这一点而不是一一插入钥匙。” 但显然不是。最后,删除键和添加键都需要整个表的副本,而“ENABLE KEYS”则不需要。如果要重新创建整个索引,我认为没有充分的理由按照您的建议进行操作。 (2认同)