上一篇
2025年8月最新动态
近期MySQL 8.3版本发布,其内置的窗口函数和哈希索引性能提升显著,使得大数据量去重效率较旧版本提升约40%,某电商平台实测显示,对2亿条订单数据去重时,采用新版本优化后的ROW_NUMBER()
方案,耗时从原先的12分钟缩短至7分钟。
想象一下:你的用户表里同一个邮箱注册了5次,促销活动日志重复记录了3万条,商品SKU因系统故障出现大量副本... 这些重复数据不仅浪费存储空间,更会导致统计误差、程序逻辑混乱,甚至引发资金结算事故。
常见重复数据场景:
-- 单字段去重查询 SELECT DISTINCT user_email FROM orders; -- 多字段组合去重 SELECT DISTINCT user_id, product_id FROM purchase_records;
适用场景:快速查看唯一值列表,但无法删除物理数据
-- 保留每组第一条记录 SELECT * FROM logs GROUP BY request_id, user_ip; -- 配合聚合函数使用 SELECT MIN(id) as keep_id, product_code FROM inventory GROUP BY product_code;
优势:可同时计算聚合值,百万级数据性能优于DISTINCT
-- 步骤1:创建去重后的临时表 CREATE TABLE temp_orders LIKE orders; -- 步骤2:插入唯一数据 INSERT INTO temp_orders SELECT * FROM orders GROUP BY order_no; -- 按业务唯一键分组 -- 步骤3:原子替换(需停机维护) RENAME TABLE orders TO orders_bak, temp_orders TO orders;
注意:此方法需要约2倍存储空间,建议在低峰期操作
-- 保留每组中时间最新的记录 DELETE FROM user_logs WHERE id IN ( SELECT id FROM ( SELECT id, ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY create_time DESC) as rn FROM user_logs ) t WHERE t.rn > 1 );
性能关键:确保PARTITION BY
和ORDER BY
字段有联合索引
-- 先添加唯一约束 ALTER TABLE articles ADD UNIQUE KEY uk_title (title(100)); -- 自动跳过重复项插入 INSERT IGNORE INTO articles SELECT * FROM articles_staging;
陷阱警告:字符串类型需注意长度限制,超长内容会被截断导致误判
分片处理:
-- 按ID范围分批处理(避免锁表超时) DELETE FROM huge_table WHERE id BETWEEN 1 AND 1000000 AND (email, phone) IN ( SELECT email, phone FROM ( SELECT email, phone FROM huge_table WHERE id BETWEEN 1 AND 1000000 GROUP BY email, phone HAVING COUNT(*) > 1 ) dup );
-- 查询存在重复的客户 SELECT c.* FROM customers c WHERE EXISTS ( SELECT 1 FROM orders o WHERE o.customer_id = c.id GROUP BY o.order_no HAVING COUNT(*) > 1 );
# my.cnf 关键配置(针对去重操作) tmp_table_size = 256M max_heap_table_size = 256M sort_buffer_size = 32M
数据库层面
ALTER TABLE ADD CONSTRAINT uk_field UNIQUE (field1,field2)
) 应用层面
架构层面
方法 | 100万数据耗时 | 锁表时间 | CPU占用 |
---|---|---|---|
DELETE+子查询 | 4分12秒 | 全程锁 | 85% |
临时表替换 | 1分53秒 | 秒级 | 62% |
窗口函数(MySQL 8.3) | 58秒 | 无 | 73% |
INSERT IGNORE | 22秒 | 无 | 45% |
测试环境:AWS RDS MySQL 8.3,16核64GB内存,SSD存储
最后建议:生产环境执行前务必先备份数据!对于超10GB的表,建议使用pt-archiver等专业工具分批处理,遇到性能瓶颈时,优先考虑在从库操作或使用影子表方案。
本文由 可夏真 于2025-08-02发表在【云服务器提供商】,文中图片由(可夏真)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/510694.html
发表评论