将MEMORY表中的百万条记录移至MYISAM表

时间:2010-04-13 09:19:22

标签: java c++ sql mysql database

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

我已经尝试过使用“INSERT INTO SELECT * FROM”查询。但有没有更快的方法呢?

感谢您的帮助。

PRASHANT

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

原则上,你应该通过以下方式获得良好的表现:

  1. 创建没有二级索引的目标表。

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

  3. 将已排序的记录插入目标表。

  4. 一次添加一个二级索引。

答案 2 :(得分:0)

这可能主要是关于调整。 MyISAM表最初是空的吗?如果是这样,你可以做一些作弊 - 在加载过程中禁用索引,然后启用它们(这对非空表不是一个好主意。)

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