Mysql解决清空百万数据表(truncate)批量更新(update)和The total number of locks exceeds the lock table size异常

今天那,看了一下我的博客好久没动了,今天就简单说一下我最近遇到的一个问题,文章主要涉及mysql的问题和解决方案,因为现在我在小bank做项目,目前主要负责的是项目的跑数工作,因为bank数据量比较大,涉及到百万的数据。

下面先来说第一个问题:

mysql删除百万数据会进行锁表,就是说当一张表超过数十万上百万的时候不能直接操作delete,这个我相信有经验的伙伴都知道,不知道 的话可以手动试一下,不过记得频繁重启mysql服务(哈哈哈)
解决方案

truncate table 表名;

truncate 的作用是清空表或者说是截断表,只能作用于表。truncate的语法很简单,后面直接跟表名即可,例如: truncate
table tbl_name 或者 truncate tbl_name 。
详情:truncate详解

第二个问题:

就是在更新数十万或者数百万的数据时也会进行锁表,以前我的一个同事是首先查出该表的所有数据的id,然后遍历进行update,上百万数据啊,用时1小时30分,所以就有了优化这一方法的一说。
因为我们这次修改的值都是一样的所以我采用了分批修改的方法,因为直接update上百万的数据也是和上面删除一样也会进行锁表。(从此我理解了锁表的概念,果然还是经历多了就懂得多了哈哈)

首先我先做一个例子吧

update 表名 set name='a' , age='10'  where 条件  limit 10000

这里要说一下,这个limit 的条数,我试了一下我这里limit 10000 是刚刚差不多,50000的时候也会进行锁表,更别提百万,所以建议不要超过10000,当然你们的性能好的话可以随意(看自己吧)

语句写好了,下面又出现了一个问题就是,我在修改的时候在修改到差不多70多万的时候,就mysql抛出了异常

java.sql.SQLException:The total number of locks exceeds the lock table size

百度了一下说是:InnoDB表执行大批量数据的更新,插入,删除操作时会出现这个问题,需要调整InnoDB全局的innodb_buffer_pool_size的值来解决这个问题,并且重启mysql服务。
解决方案:

mysql -u root -p

输入账号密码

进入mysql命令(直接在小海豚,或者navicat新建查询也可)

show variables like "%_buffer%";

默认的:innodb_buffer_pool_size=8M

修改 innodb_buffer_pool_size的值

修改的格式是: 1M乘以1024乘以1024,设置的时候也要这样计算

SET GLOBAL innodb_buffer_pool_size=2097152;(2乘以1024乘以1024乘以1024)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值