Mysql大数据量更改表结构&建索引

更改表结构

例:对user表的处理
原文链接:https://blog.csdn.net/LLLLLiSHI/article/details/100726849

1.创建一个源表的复制版

CREATE TABLE user_bak like user

可以用like然后建完表再改
也可以不用like,直接建新表

2.将源表数据,插入到新建表中

insert into user_bak select * from user;

3.删除源表(谨慎操作,可先把源表rename)

DROP TABLE user;

4.更改新建表的name

RENAME TABLE user_bak to user;

注:
1.执行期间,新的insert及update数据暂未处理(触发器)
2.对大表处理,选择深夜进行……
3.将原表中的数据全部拷贝到新表中,拷贝之后再创建索引。切不可先创建索引再拷贝数据。
参考链接在这里

!!遇到问题

 1206 - The total number of locks exceeds the lock table size

临时表过小
https://my.oschina.net/u/2615680/blog/4740474
InnoDB表执行大批量数据的更新,插入,删除操作时会出现这个问题,需要调整InnoDB全局的innodb_buffer_pool_size的值来解决这个问题,并且重启mysql服务。

#查看MySQL的存储引擎
mysql> show variables like '%storage_engine%';

#查看MySQL缓存池的大小
#可以看到,默认的缓存池大小是 8388608 = 8 * 1024 * 1024 = 8 MB。需要把它改大一点。
mysql> show variables like "%_buffer_pool_size%";
+-------------------------+---------+
| Variable_name           | Value   |
+-------------------------+---------+
| innodb_buffer_pool_size | 8388608 |
+-------------------------+---------+
#修改innodb_buffer_pool_size
mysql> SET GLOBAL innodb_buffer_pool_size=8589934592;
#改为8g.

修改缓存池值的时候数字中间不可以有逗号
(第一次直接从计算器拷过来的数字,中间带逗号,mysql就给报错了)
注意mysql5.7版本之后的修改即生效,以前版本的得修改my.cnf再重启。
把缓存池改的太大也不可行,这样占用内存会很大,mysql服务会宕掉

所以我还是认输了,用了limit分批把数据倒到了新表,一百万条数据不到七十秒,多写几条sql就完了。
(我感觉由于原表没有索引的关系,越到后来会越慢)

还有

有一篇文章说可以改frm文件,但我没找着,在这里记录一下以作参考。

还有还有

数据是存放在一个很大的csv文件里的,其实是可以建立好自己想要的表结构,使用load data infile导入的!
就是也慢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值