mysql去重效率_MySQL处理大量数据的效率问题

本文分享了处理大型数据集的经验,介绍了从远程数据库下载数据的高效方法,并详细讲解了利用MySQL进行数据去重的过程。

最近在处理项目组的一个数据集,数据量每张表在百万级,由于数据量较大在数据下载和处理方面都可以说是旷日持久,这篇记录一下相关的经验。

数据下载

拿到的数据是在远程数据库里面,原先打算直接从远程库里下载csv或txt到电脑上,但在mysql上进行这样的操作好像不是很方便速度也很慢。

目前在使用的方法是将远程数据库里面的数据导出为sql到本地,导入本地数据库后进行操作,但这一过程也很缓慢,一个百万级数据库在navicat里面可能要导个半个小时,在命令行可能会快一点但没有尝试。

MySQL中的去重

基本思路是复制原表A结构新建一个表B,对表B添加UNIQUE约束,然后将表A中的数据逐条插入表B,约束会自动实现去重。

#复制表结构

CREATE TABLE newTable LIKE oldTable;

#修改表字段,因为httpURL太大

ALTER TABLE newTable MODIFY httpURL VARCHAR(300);

#为表格添加约束条件(在Mysql5中,如果约束字段过大,则报错,因此要先执行上面的修改表字段)

ALTER TABLE newTable ADD UNIQUE(IP,timeStart);

#为新表中添加数据(约束条件自动去重)

INSERT IGNORE newTable

SELECT * FROM newTable

ORDER BY IP,timeStart;

测试的表数据量在三百万左右,去重后数据在二百万左右,在navicat实现时间2168.470s,命令行应该会更快。

### MySQL 中分组与操作的性能优化 #### 使用 `DISTINCT` 和 `GROUP BY` 的差异及其影响因素 在 MySQL 中,`DISTINCT` 和 `GROUP BY` 都可用于复记录。然而,在不同版本下两者的效率表现有所不同。 对于 MySQL 8.0 及之前的版本,`GROUP BY` 默认会对结果集进行隐式排序,这可能会触发文件排序 (`filesort`) 操作,从而降低查询速度[^1]。而 `DISTINCT` 则不会自动引入这种额外开销,因此在这种情况下通常更高效一些。 但是自 MySQL 8.0 起,默认行为有所改变——移除了不必要的排序步骤,使得当两者用于简单场景下的唯一化处理时,其执行时间变得几乎相等。 #### 如何提高基于 `GROUP BY` 查询的速度? 为了进一步改善涉及大量数据表扫描以及复杂聚合函数调用所带来的延迟问题: - **利用覆盖索引**:如果可能的话,尝试构建能够完全满足所选字段需求而不必回溯至原始表格读取其他信息的复合型索引结构; - **减少返回列数**:只选取真正必要的属性参与运算; - **适当调整缓存参数配置**:增大临时表空间大小、增加连接池容量等措施有助于缓解高并发访问压力并加快响应速率; - **考虑分区技术的应用**:针对特别庞大的单张关系数据库对象实施水平切片策略可有效分散I/O负载分布不均现象的发生概率; - **避免不必要的子查询嵌套**:尽量简化逻辑表达式的书写方式以利于编译器更好地理解意图进而做出最优路径规划决策。 ```sql SELECT DATA.* FROM ( SELECT event_id, MAX(created_at) AS created_at FROM t1 GROUP BY event_id ) LATEST INNER JOIN t1 AS DATA ON LATEST.event_id = DATA.event_id AND LATEST.created_at = DATA.created_at; ``` 上述 SQL 示例展示了如何通过先获取每条事件最新的创建时间戳再关联原表来达到消除冗余的目的,这种方法不仅直观易懂而且易于维护扩展[^2]。 #### 关于 `ORDER BY NULL` 对性能的影响 值得注意的是,在某些特定条件下向 `GROUP BY` 子句附加 `NULL` 排序指示符可以阻止服务器试图对输出序列施加默认顺序排列规则,进而规避潜在的性能瓶颈。不过需要注意的是这样做并不会显著缩短整体耗时时长除非存在明显的排序成本过高情形[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值