加载数据Infile +禁用/启用密钥性能

时间:2009-12-28 04:02:42

标签: sql mysql load-data-infile

我有一张大约有700万行的表格。每天一次,我需要在此表中批量导入大约200,000个新行。为此,我首先使用LOAD DATA INFILE禁用表上的键,然后重新启用表上的键。

我遇到的问题是ALTER TABLE my_table ENABLE KEYS声明 大约需要15分钟才能完成。我试图通过增加myisam_sort_buffer_size来提高性能,但似乎没有帮助。还有其他想法吗?

2 个答案:

答案 0 :(得分:3)

您可以尝试使用mysqladmin和myisamchk等外部MySQL工具。它们位于/ usr / local / mysql / bin路径中,用于常规安装。

来自MySQL网站的解决方案路径:

  
      
  • 执行FLUSH TABLES语句或mysqladmin flush-tables命令。

  •   
  • 使用myisamchk --keys-used = 0 -rq / path / to / db / tbl_name。这将删除所有   使用表的索引。

  •   
  • 使用LOAD DATA INFILE将数据插入表中。这不会更新任何   索引因此非常快。

  •   
  • 如果您打算将来只读取该表,请使用myisampack   压缩它。见13.4.3.3节,   “压缩表特性”。

  •   
  • 使用myisamchk -rq / path / to / db / tbl_name重新创建索引。这之前在内存中创建了索引树   把它写到磁盘上,这很多   更快地更新索引期间   LOAD DATA INFILE因为它避免了   大量的磁盘寻求。所结果的   索引树也完美平衡。

  •   
  • 执行FLUSH TABLES语句或mysqladmin flush-tables命令。

  •   

mysql official documents

答案 1 :(得分:1)

假设您希望最大程度地减少因锁定表而导致的停机时间,我相信标准程序是克隆表,在克隆中执行插入(根据您的具体情况,根据具体情况使用或不禁用密钥),并且一旦完成,发出DROP TABLE tableName;RENAME TABLE tableClone TO tableName