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
您必须根据引擎类型选择您的方法...优化MyISAM或InnoDB.
我们最近运行了一个基准测试,比较了插入数据的不同方法,并测量了插入前和所有索引完全恢复后的时间.它在一张空桌子上,但我们使用了多达1000万行.
MyISAM数据与LOAD DATA INFILE
和ALTER 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 INTO
和UPDATE
,在"密"和"分散"表(我不太清楚怎么样,我觉得它是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
如果你不是从一张空桌子开始,那么它们就会毫无价值,有时甚至是有害的.
索引新键将花费一些时间。您可以决定是一次性完成所有操作(首先禁用它)还是一次完成一个操作(保持原样并在添加每条记录时为其建立索引)
我会选择后者,而不是禁用你的钥匙。如果您担心服务器压力过大,您可以尝试批量插入,例如每分钟仅插入一定数量的插入。
归档时间: |
|
查看次数: |
60071 次 |
最近记录: |