首先是查出重复的数据,下面的代码是查出重复数据中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内存以上为好)设置如下