在MySQL中直接去重数据!速度最快的代码!含The total number of locks exceeds the lock table size的解决办法!

7 篇文章 0 订阅

首先是查出重复的数据,下面的代码是查出重复数据中id大的数据。

就是比如有三个数据是一样的,用下面的代码可以查出id大的另外两个数据。

如果要查出id小的数据,把Min(id) AS minno改为Max(id) AS minno

多说一句,id是你的主键,有些人用number有些人用num,我用id,就是个字段名

SELECT *
FROM
	表名
WHERE
	id(主键,保留最小的) NOT IN (
		SELECT
			dt.minno
		FROM
			(
				SELECT
					Min(id) AS minno
				FROM
					表名
				GROUP BY
					字段名(去重的根据)
			) dt
	)

删除重复数据,还是和上面代码差不多,删除千万数据三分钟就搞定!绝对推荐!

DELETE
FROM
	表名
WHERE
	id(主键,保留最小的) NOT IN (
		SELECT
			dt.minno
		FROM
			(
				SELECT
					Min(id) AS minno
				FROM
					表名
				GROUP BY
					字段名(去重的根据)
			) dt
	)

注意!用delete代码的时候,可能会出现内存不够用的情况

错误提示:The total number of locks exceeds the lock table size

这是因为你要删除的数据实在太多了,内存不够用

解决办法:

修改MySQL的innodb_buffer_pool_size

MySQL的innod缓冲池过小也就是innodb_buffer_pool_size

此修改为暂时的,就是重启电脑后会还原配置文件所设置的innodb_buffer_pool_size

我觉得不用去修改配置文件的innodb_buffer_pool_size大小,因为去重就只弄一次就行了,用以下方法即可

1.mysql命令行设置

show variables like "%_buffer%";查看大小

使用SET GLOBAL innodb_buffer_pool_size=67108864;(3*1024*1024*1024,不要忘记;号,看你自己的电脑内存能承受多大的内存,如果数据本身就十几G的话,最好设计innodb_buffer_pool_size为10G内存以上为好)设置如下

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值