MySQL禁用和启用密钥

Mel*_*lon 26 mysql sql database

在我的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;
Run Code Online (Sandbox Code Playgroud)

但我不知何故觉得,禁用/启用键更适合用于空表插入.

虽然在我的情况下,我已经在表中有2,000,000条记录,但是ENABLE KEYS,mysql将重新创建所有索引(包括现有记录和新添加的记录),在我的情况下可能不会产生有效的数据插入.重新创建所有索引需要很长时间,可能也是如此OPTIMIZE TABLE

我想问你的意见我是对的,我怎样才能在我的案例中插入有效的数据?

Arn*_*rne 50

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

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

MyISAM数据与LOAD DATA INFILEALTER TABLE ... ENABLE/DISABLE KEYS赢得的手在我们测试下来(在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行,无论如何都要重建索引.通过批量插入没有"额外的碎片".

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

更新:根据我们最近和完整的测试结果,DISABLE/ENABLE键的建议是错误的.

的同事,有一个程序运行多个不同的测试-与InnoDB的/ MyISAM数据表预填充空,选择和插入速度有LOAD DATA LOCAL,INSERT INTO,REPLACE INTOUPDATE,在"密"和"分散"表(我不太清楚怎么样,我觉得它是DELETE FROM ... ORDER BY RAND() LIMIT ...一个固定的种子,所以它仍然是可比较的)和启用和diasabled指数.

我们在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有相同的配置-我们'仍然在寻找原因).我们所发现的是那个DISABLE KEYS,ENABLE KEYS如果你不是从一张空桌子开始,那么它们就会毫无价值,有时甚至是有害的.

  • 这是一个非常好的答案.感谢您的深入研究! (2认同)

mat*_*lie 1

索引新键将花费一些时间。您可以决定是一次性完成所有操作(首先禁用它)还是一次完成一个操作(保持原样并在添加每条记录时为其建立索引)

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