将百万条记录从MEMORY表移动到MYISAM表

5

我正在寻找一种快速将记录从MEMORY表移动到MYISAM表的方法。MEMORY表中有约50万条记录。两个表的结构完全相同(列数、数据类型等均相同)。但是,MYISAM表在几个列上建立了索引(B-TREE)。其中大部分为无符号整数的25个列。

我已经尝试使用“INSERT INTO SELECT * FROM”查询。但是是否有更快的方法来完成这个操作呢?

感谢您的帮助。

Prashant

3个回答

1
正如其他人指出的那样——你在插入时不应使用索引。 你可以禁用每次插入时的更新:
ALTER TABLE table DISABLE KEYS;
INSERT INTO table
ALTER TABLE tbl_name ENABLE KEYS;

同时锁定表以进行单索引写入:

LOCK TABLES table WRITE;
INSERT INTO table
UNLOCK TABLES;

无论如何,如果您在单个INSERT ... SELECT中使用它,可能不会获得显着的性能提升。

您还可以调整服务器配置中的bulk_insert_buffer_size设置。

更多信息请参见:http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html


0

原则上,您应该通过以下方法获得良好的性能:

  1. 创建目标表时不使用辅助索引。

  2. 按照目标表的主键对源表内容进行排序。

  3. 将排序后的记录插入到目标表中。

  4. 一个接一个地添加辅助索引。


是的,除了在MyISAM中,添加一个次要索引会重建所有索引和数据文件,因此您确实希望一次性添加所有索引。 - MarkR

0

很可能主要涉及调优。 MyISAM表最初是否为空? 如果是,则可以使用一些技巧-在加载期间禁用索引,然后启用它们(这对于非空表不是一个好主意)。

在内存表上进行ORDER BY不是一个特别好的主意,因为它们通常使用哈希索引,因此不能执行有序索引扫描,这将引入额外的文件排序(sort),这可能很糟糕。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接