繁体   English   中英

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

[英]MySQL alter table enable keys not as fast as promised

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

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

方法1

load data infile ...;

方法2

alter table disable keys;
load data infile ...;
alter table enable keys;

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

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

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

欢迎评论

如果您正在处理数十亿条记录,并使用MySQL 5.1或更高版本,那么您可能会发现分区将有利于提高性能......在分区表中处理索引时,索引也会被分区; 并且因为每个索引仅针对总数据的分区/子集构建,所以重建的分类开销应该显着减少。

“没有那么快的承诺” -呃,你有500万点的记录,当然这将需要更长时间比插入20条记录。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM