更改表结构
例:对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导入的!
就是也慢。