【问题标题】:MySQL disable & enable keysMySQL 禁用和启用键
【发布时间】:2011-11-21 10:53: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;

但我不知何故觉得,禁用/启用键用于空表插入更有意义。

虽然在我的情况下,我的表中已经有 2,000,000 条记录,但当ENABLE KEYS 时,mysql 将重新创建所有索引(包括现有记录和新添加的记录),这可能不会产生有效的数据插入在我的情况下作为一个整体。 因为重新创建所有索引需要很长时间OPTIMIZE TABLE

可能也是如此

我想询问您对我是否正确以及如何在我的情况下进行有效的数据插入的意见?

【问题讨论】:

  • 您确定密钥更新是瓶颈吗?
  • 这是我的担心,这里有人有同样的担心forums.mysql.com/read.php?21,68820,68939#msg-68939
  • 无论如何,一旦您再次启用这些索引,它们就会被创建。尝试做一个 bul 插入而不是行/行,也做一个更新统计,看看是否有什么改善。
  • 批量插入,当在一个 INSERT 语句中插入多行时。
  • 在我的情况下插入数据后是否需要优化表?

标签: mysql sql database


【解决方案1】:

您必须根据引擎类型选择您的方法...优化for MyISAMfor InnoDB

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

带有LOAD DATA INFILEALTER TABLE ... ENABLE/DISABLE KEYS 的MyISAM 在我们的测试中胜出(在Windows 7 系统上,MySQL 5.5.27 - 现在我们正在Linux 系统上进行尝试)。

ENABLE 和 DISABLE KEYS 不适用于 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.something、5.5.27、5.6.2)对其进行了测试(但在两个操作系统上的版本不同)。 MyISAM 只有在桌子空了的时候才会赢。当数据已经存在并且通常性能更好时,InnoDB 会更快(除了 hdd-space - MyISAM 在磁盘上更小)。

不过,要真正从中受益,您必须自己进行测试 - 使用不同的版本、不同的配置设置和很大的耐心 - 特别是在奇怪的不一致方面(5.0.97 比 5.5.27 快很多) config - 我们仍在寻找原因)。 我们发现如果您不从空桌开始,DISABLE KEYSENABLE KEYS 几乎毫无价值,有时甚至有害。

【讨论】:

  • 这是一个非常棒的答案。感谢您的深入研究!
  • 嗯,很努力,但我会怀疑这个结论,因为测试结果的巨大差异不是表明这里有很多未知因素吗?
【解决方案2】:

索引新键需要一些时间。由您决定是一次性完成(首先禁用它)还是一次完成(通过保持原样并在添加每条记录时让它索引)

我会选择后者,而不是禁用您的密钥。如果您担心服务器压力太大,您可以尝试分批插入,例如每分钟只有一定数量的插入。

【讨论】:

  • @mlitn,数据插入后优化表怎么样,这一步有必要吗?
猜你喜欢
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多