3

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

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

4

2 回答 2

3

您可以尝试外部 MySQL 工具,如 mysqladmin 和 myisamchk。它们位于常规安装的 /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官方文档

于 2010-12-19T10:00:22.723 回答
1

假设您希望最大限度地减少因表被锁定而导致的停机时间,我相信标准程序是克隆表,在克隆中执行插入(有或没有禁用键,具体取决于您的具体情况),一旦完成,发出DROP TABLE tableName;RENAME TABLE tableClone TO tableName

于 2017-04-27T14:05:59.727 回答