社区
MySQL
帖子详情
mysql5.7 union all大数据量问题
linfeng763
2020-05-15 08:51:15
对mysql 5.7版本,查询用union all 后,因为大数据量,存在问题。现有几个疑问?
1. MySQL5.7执行UNION ALL不再产生临时表,那临时数据是保存在内存么?
2. 临时的中间数据如果是保存在内存,那临界点是多少大小?
3. 这个临界点是否通过MySQL的那个系统参数配置可以调整?
问题现象参考:https://blog.csdn.net/linfeng763/article/details/106123698
...全文
789
2
打赏
收藏
mysql5.7 union all大数据量问题
对mysql 5.7版本,查询用union all 后,因为大数据量,存在问题。现有几个疑问? 1. MySQL5.7执行UNION ALL不再产生临时表,那临时数据是保存在内存么? 2. 临时的中间数据如果是保存在内存,那临界点是多少大小? 3. 这个临界点是否通过MySQL的那个系统参数配置可以调整? 问题现象参考:https://blog.csdn.net/linfeng763/article/details/106123698
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
linfeng763
2020-05-19
打赏
举报
回复
调整了 innodb_buffer_pool_size,默认128M,调整256M后测试,没有问题。
不过改问题,最终采用union all调整为inner jion方式解决
宇峰科技
2020-05-16
打赏
举报
回复
1
查询大结果集是如何返回的:
innodb的数据是保存在主键索引上的,所以全表扫描实际是直接扫描表的主键索引。所以全扫描时查到的每一行都可以直接放到结果集里面, 然后返回客户端。
实际上,服务端并不需要保存一个完整的结果集。取数据和发数据的流程是这样的:
1、取一行,写到net_bufffer中,这块内存的大小是由参net_buffer_length定义的,默认16k。
2、重复获取行,直到net_buffer写满,调用网络接口发出去。
3、如果发送成功,就清空net_buffer,然后继续取下一行,并写入net_buffer。
4、如果发送函数返回eagain或wsaewouldblock,就表示本地网络栈(socket send buffer)写满了,进行等待。直到网络栈重新可写,再继续发送。
从流程中可以看到
1、在一个查询发送过程中,占用的mysql内部的内存最大就是net_buffer_length这么大,并不会达到20G(需要的数据大小)
2、socket send buffer也不可能达到20G(默认定义/proc/sys/net/core/wmem_default),如果socket send buffer 写满,就会暂停读数据的流程。
也就是说mysql是边读边发的。意味着,如果客户端接收的很慢会导致mysql服务端由于结果发不出去,这个事务的执行时间变长。
如果要减少处于sending to client这种状态的话,将net_buffer_length参数设置为一个更大的值是一个可选的方案。
查询语句的状态变化是这样的(略去无关状态):
1、mysql查询语句进行执行阶段后,首先把状态设置成sending data;
2、然后发送执行结果的列相关信息(meta data)给客户端
3、再继续执行语句的流程
4、执行完成后,把状态设置成空字符串。
也就是说 sending data并不一定是指正在发送数据,而可能是处于执行器过程中的任意阶段。
仅当一个线程片于等待客户端接收结果的状态,才会显示sending to client,而如果显示sending data意思只是正在执行。
innodb_buffer_pool_size一般建议设置为可用物理内存的60%或80%。
inndob内存管理用的是最近最少使用算法(Least Recently Used,LRU)算法,这个算法的核心就是淘汰最久未使用的数据。
MySQL5.7
union
all
大数据
量
问题
问题
现象 数据库有3张表,如chinese_score、math_score、english_score,分别代表学生的语文成绩、数学成绩、英语成绩,每张表的表结构和数据
量
一致,200万数据
量
。表结构如下: ID(主键) code(学号) name(姓名) score(成绩) 执行的SQL(获得每个学生的总成绩): select code, name, sum(t.score) total_score from ( select code, name, s
UNION
与
UNION
ALL 的区别
SQL中
UNION
和
UNION
ALL的区别主要在于:
UNION
会去除重复行并自动排序,而
UNION
ALL保留所有原始数据不排序;
UNION
ALL性能更高,避免了去重和排序的开销; 使用场景不同:需要确保结果唯一性时用
UNION
,性能敏感或已知无重复时用
UNION
ALL; 在
大数据
量
场景下,
UNION
可能造成性能
问题
。实际应用中应根据业务需求选择合适的方式。
SQL中
UNION
与
UNION
ALL的性能差异与使用场景
SQL查询中的结果集合并操作是数据库开发中的基础技术,
UNION
和
UNION
ALL作为两种主要的集合操作符,其核心区别在于是否自动去除重复记录。从实现原理来看,
UNION
ALL直接拼接结果集,而
UNION
需要额外的排序和去重步骤,这导致在处理
大数据
量
时可能产生近10倍的性能差异。在数据仓库建设、报表生成等典型应用场景中,
UNION
ALL因其高性能特性常被用于日志分析、分表查询合并等操作,而
UNION
则更适合需要精确去重的用户统计等场景。合理选择这两种操作符,结合EXPLAIN执行计划分析和适当的索引优
SQL中
UNION
和
UNION
ALL性能差异与选型指南
UNION
和
UNION
ALL是SQL中基础但极易误用的集合操作符,其核心区别远不止‘是否去重’——
UNION
触发全字段哈希、强制排序、临时磁盘写入等重型物理操作,而
UNION
ALL仅做流式追加,零额外开销。在分表查询、日志归档、实时看板等95%以上场景中,
UNION
ALL可带来数
量
级性能提升;仅当需严格主键校验、DAU去重统计或维度表黄金副本构建时,才应使用
UNION
。理解底层执行机制(如HashAggregate、filesort)与业务语义边界(如NULL处理、字符集对齐),才能避免慢查询、数据失
MySQL 集合运算 3 大性能陷阱:千万级数据下
UNION
ALL 比 JOIN 慢 5 倍
本文深入解析MySQL集合运算在千万级数据下的性能陷阱,揭示
UNION
ALL比JOIN慢5倍的原因,并提供优化方案。涵盖并集、交集、差集运算的性能对比及索引优化策略,帮助开发者提升查询效率。
MySQL
57,062
社区成员
56,759
社区内容
发帖
与我相关
我的任务
MySQL
MySQL相关内容讨论专区
复制链接
扫一扫
分享
社区描述
MySQL相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章