我正在寻找一种快速的方法将记录从MEMORY表移动到MYISAM表。 MEMORY表有大约50万条记录。两个表具有完全相同的结构(相同数量的列,数据类型等)。但MYISAM表在几列上被索引(B-TREE)。大约有25列,其中大多数是无符号整数。
我已经尝试过使用“INSERT INTO SELECT * FROM”查询。但有没有更快的方法呢?
感谢您的帮助。
PRASHANT
答案 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)
原则上,你应该通过以下方式获得良好的表现:
创建没有二级索引的目标表。
在目标表的主键上对源表的内容进行排序。
将已排序的记录插入目标表。
一次添加一个二级索引。
答案 2 :(得分:0)
这可能主要是关于调整。 MyISAM表最初是空的吗?如果是这样,你可以做一些作弊 - 在加载过程中禁用索引,然后启用它们(这对非空表不是一个好主意。)
在内存表上执行ORDER BY并不是一个特别好的主意,因为它们通常使用哈希索引,因此无法进行有序索引扫描,因此会引入额外的filesort(),这可能很糟糕。