如何在Mysql大表

时间:2017-09-22 00:22:49

标签: mysql stored-procedures cursor bigdata database

我有一张关于200,000,000行MYISAM的大表,带有一个组合主键 但我没有索引。

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

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 个答案:

答案 0 :(得分:1)

使用limit 100000 offset 100000 ;表示MySQL搜索了100000条记录并从100001获取记录;

搜索100000条记录是TABLE FULL SCAN,所以它非常慢;

使用Primary key进行搜索是更好的方法,例如... where pk >=100000 and pk <= 199999

如果Primary key无法分为数字,请使用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;