我正在寻找一种快速将记录从MEMORY表移动到MYISAM表的方法。MEMORY表中有约50万条记录。两个表的结构完全相同(列数、数据类型等均相同)。但是,MYISAM表在几个列上建立了索引(B-TREE)。其中大部分为无符号整数的25个列。
我已经尝试使用“INSERT INTO SELECT * FROM”查询。但是是否有更快的方法来完成这个操作呢?
感谢您的帮助。
Prashant
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
原则上,您应该通过以下方法获得良好的性能:
创建目标表时不使用辅助索引。
按照目标表的主键对源表内容进行排序。
将排序后的记录插入到目标表中。
一个接一个地添加辅助索引。
很可能主要涉及调优。 MyISAM表最初是否为空? 如果是,则可以使用一些技巧-在加载期间禁用索引,然后启用它们(这对于非空表不是一个好主意)。
在内存表上进行ORDER BY不是一个特别好的主意,因为它们通常使用哈希索引,因此不能执行有序索引扫描,这将引入额外的文件排序(sort),这可能很糟糕。