首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL alter启用密钥不像承诺的那样快

问MySQL alter启用密钥不像承诺的那样快
EN

Stack Overflow用户
提问于 2011-03-04 09:33:00
回答 3查看 4.2K关注 0票数 5

所以我有一个大表,有20多亿张记录,还有5个多列键。

有两种方法可以用于插入数据:

方法1

代码语言:javascript
复制
load data infile ...;

方法2

代码语言:javascript
复制
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 with keycache。

我不知道这是为什么。MySQL声称禁用键对于插入大容量数据非常好,但这显然取决于上下文。如果它要从零开始重新生成所有的键,为什么不需要大约3个小时,就像我从一个空表开始的时候一样?或者,如果一个接一个地插入键,为什么不花大约3个小时,这就是方法1所需的时间?

欢迎提出意见。

EN

回答 3

Stack Overflow用户

发布于 2011-03-04 10:02:14

显然,所花费的时间可能会有相当大的变化。

http://www.mysqlperformanceblog.com/2007/07/05/working-with-large-data-sets-in-mysql/

票数 1
EN

Stack Overflow用户

发布于 2011-03-04 10:20:03

如果您正在处理数十亿条记录,并且使用MySQL 5.1或更高版本,那么您可能会发现分区会提高性能.在使用分区表中的索引时,也会对索引进行分区;而且由于每个索引只针对您的总数据的一个分区/子集构建,所以重构的排序开销应该大大减少。

票数 1
EN

Stack Overflow用户

发布于 2011-03-04 09:52:53

“不像承诺的那么快”--呃,你有5000000张唱片,当然比插入20张唱片还要长一点。

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

你所描述的速度是相当合理的IMHO -使用最快的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5191959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档