如何在Mysql大表中将数据从表移动到另一个表

Posted

技术标签:

【中文标题】如何在Mysql大表中将数据从表移动到另一个表【英文标题】:How to move data from table to an other in Mysql big table 【发布时间】:2017-09-22 00:22:49 【问题描述】:

我有一个大约 200,000,000 行的 MISAM 大表,其中包含一个组合主键 但我没有索引。

我想创建一个索引,但问题是当我执行添加索引请求时表服务器坏了:

ALTER TABLE `db`.`table` 
ADD INDEX `index_0001` (`col1` ASC);

所以我将创建一个新表并配置所需的索引并将数据移动到新表并重命名它。

我试过这个方法:

INSERT INTO `db`.`table` (field1,field2,..) select field1,field2,....from eventdata limit 100000 offset 0 ;
INSERT INTO `db`.`table` (field1,field2,..) select field1,field2,....from eventdata limit 100000 offset 100000 ;
INSERT INTO `db`.`table` (field1,field2,..) select field1,field2,....from eventdata limit 100000 offset 200000 ;
.......... etc 

但是当偏移量超过 100,000,000 时,查询行响应变得更慢。

还有其他解决办法吗?

tahnks

【问题讨论】:

【参考方案1】:

使用limit 100000 offset 100000 ;表示mysql搜索了100000条记录,从100001处获取记录;

搜索100000条记录是TABLE FULL SCAN,所以很慢;

使用Primary key 搜索更好,例如... where pk >=100000 and pk <= 199999

如果Primary key不能分成Number,使用Join

select field1,field2... from tbname tb1,(select pk from tbname limit 100000 offset 100000)tb2 where tb1.pk = tb2.pk

使用Primary key搜索记录优于TABLE FULL SCAN;

【讨论】:

谢谢。但我有一个来自 3 个字段的复合主键 @ALWAN 这个示例只是一个示例,根本原因是表全扫描,使用主键或其他 unque key 更好:P

以上是关于如何在Mysql大表中将数据从表移动到另一个表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 迁移中将列(包含内容)移动到另一个表?

mysql 如何把查询到的结果插入到另一个表中

如何将数据从表视图传递到另一个视图控制器

MYSQL:如何在 mysql 中将整行从一个表复制到另一个表,而第二个表有一个额外的列?

如何将不同的数据从表视图传递到另一个视图控制器

从表视图到另一个表视图之间传递数据(多)[重复]