在我的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
可能也是如此
我想问一下你的意见,关于我是对的,我如何在我的案例中有一个有效的数据插入?
发布于 2012-08-07 18:57:00
你必须根据引擎类型来选择你的方法……优化for MyISAM或for InnoDB。
我们最近运行了一个基准测试,比较了插入数据的不同方式,并测量了从插入之前到所有索引完全恢复的时间。它在一个空表上,但我们使用了多达1000万行。
带有LOAD DATA INFILE
和ALTER 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 LOCAL
,INSERT INTO
,REPLACE INTO
和UPDATE
的选择和插入速度,对“密集”和“碎片”表(我不是很确定,我认为它是沿着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 KEYS
和ENABLE KEYS
几乎毫无价值,有时甚至是有害的。
发布于 2011-11-21 20:45:03
索引新的关键字将需要一些时间。您可以决定是一次性完成(首先禁用它)还是一次完成一个(保持原样,并在添加每条记录时对其进行索引)
我会选择后者,而不是禁用你的钥匙。如果你害怕给服务器带来太大的压力,你可以尝试批量插入,例如每分钟只有一定量的插入。
https://stackoverflow.com/questions/8210608
复制相似问题