首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL禁用和启用密钥

MySQL禁用和启用密钥
EN

Stack Overflow用户
提问于 2011-11-21 18:53:29
回答 2查看 70.1K关注 0票数 29

在我的MySQL数据库中,有一个包含2,000,000条记录的表。现在,我想在这个表中再插入6,000,000条新记录。

为了加快插入速度,我认为我应该使用禁用/启用键,如下所示:

ALTER TABLE cars DISABLE KEYS;

INSERT INTO cars ...
...
...
INSERT INTO cars ...

ALTER TABLE search_all_values ENABLE KEYS;

OPTIMIZE TABLE cars;

但不知何故,我觉得使用disable/enable键插入空表更有意义。

而在我的例子中,表中已经有2,000,000条记录,当ENABLE KEYS时,mysql将重新创建所有的索引(包括现有的记录和新添加的记录),这在我的例子中可能不会作为一个整体产生有效的数据插入。当重新创建所有索引时,将花费很长时间OPTIMIZE TABLE可能也是如此

我想问一下你的意见,关于我是对的,我如何在我的案例中有一个有效的数据插入?

EN

回答 2

Stack Overflow用户

发布于 2012-08-07 18:57:00

你必须根据引擎类型来选择你的方法……优化for MyISAMfor InnoDB

我们最近运行了一个基准测试,比较了插入数据的不同方式,并测量了从插入之前到所有索引完全恢复的时间。它在一个空表上,但我们使用了多达1000万行。

带有LOAD DATA INFILEALTER TABLE ... ENABLE/DISABLE KEYS的MyISAM在我们的测试中轻松取胜(在Windows7系统上,MySQL 5.5.27 --现在我们正在Linux系统上试用它)。

ENABLE和DISABLE键不适用于InnoDB,它只适用于MyISAM。对于InnoDB,如果您确定您的数据不包含重复项,请使用SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0; (不要忘记在上传完成后将其设置为1 )。

我不认为在批量插入之后需要OPTIMIZE TABLE - MySQL行是按插入排序的,索引无论如何都会重新构建。通过执行批量插入,不会产生“额外的碎片”。

如果我犯了事实错误,请随时发表评论。

更新:根据我们最近和完整的测试结果,禁用/启用密钥的建议是错误的。

一位同事让一个程序运行多个不同的测试-一个带有InnoDB / MyISAM预填充值和空值的表,使用LOAD DATA LOCALINSERT INTOREPLACE INTOUPDATE的选择和插入速度,对“密集”和“碎片”表(我不是很确定,我认为它是沿着DELETE FROM ... ORDER BY RAND() LIMIT ...的路线使用固定的种子,所以它仍然是可比较的),以及启用和差异索引。

我们在Windows和Linux上测试了许多不同的MySQL版本(5.0.27,5.0.96,5.1.thing,5.5.27,5.6.2) (虽然两个操作系统上的版本不一样)。只有当桌子是空的时候,MyISAM才会赢。当数据已经存在时,InnoDB更快,并且通常性能更好(除了hdd-space - MyISAM在磁盘上较小)。

不过,要真正受益于它,你必须自己测试它-使用不同的版本,不同的配置设置和大量的耐心-特别是关于奇怪的不一致(5.0.97比使用相同配置的5.5.27快得多-我们仍在寻找原因)。我们确实发现,如果不从空表开始,DISABLE KEYSENABLE KEYS几乎毫无价值,有时甚至是有害的。

票数 55
EN

Stack Overflow用户

发布于 2011-11-21 20:45:03

索引新的关键字将需要一些时间。您可以决定是一次性完成(首先禁用它)还是一次完成一个(保持原样,并在添加每条记录时对其进行索引)

我会选择后者,而不是禁用你的钥匙。如果你害怕给服务器带来太大的压力,你可以尝试批量插入,例如每分钟只有一定量的插入。

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

https://stackoverflow.com/questions/8210608

复制
相关文章

相似问题

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