社区
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
...全文
660
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
mysql5.7
空间查询_MYSQL 8 VS MYSQL 5.7 查询真的“快乐”吗?
对没错字,就是快乐吗?最近不少单位开始使用MYSQL 8了,当然也是尝试性的,大面积的铺开应该在明年,MYSQL8 目前在MGR 的变动还是蛮大的。这里主要想看看到底MYSQL 8 在查询优化方面到底比MYSQL 5.7 有什么进步,或什么期待,是否和官方宣称的提高N倍性能。测试机 : SSD 硬盘 (两个数据库服务器,装在一个磁盘底下,内存MYSQL 5.7 稍微吃点亏 6G MYSQL 8...
mysql
union
优化_mysql 5.7.3 对
union
all 的优化
一年的时间过得真快,去年这个时候,哥还在上海看mysql 5.6的feature, 今年就在北京看mysql 5.7的feature了。mysql的
union
语句一直是被人广为诟病的,因为它不分青红皂白,总是会创建temporary table, 然后把全部数据写入此临时表,再从中读取数据返回给用户。其实有些情况下,比如
UNION
ALL且没有最外层排序条件( top level ORDER BY...
mysql 5.7 海
量
数据_datafactory5.6向
mysql5.7
添加大
量
测试数据
1.下载安装datafactory5.62.下载安装
mysql5.7
,并创建数据库guest_test和表sign_event3.下载安装odbc5.34.打开datafactory配置数据源,如下流程图5.设置表的各个字段值规则与数据库对应,点击run,提示成功,查看sign_event表有新增的大
量
数据遇到的几个
问题
:1.最开始安装的是odbc3.5版本(32和64都装了),后来执行的时候提示...
mysql 5.7 临时表_MySQL 5.7内部临时表使用
一、MySQL中的两种临时表外部临时表通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表。这种临时表只对当前用户可见,当前会话结束的时候,该临时表会自动关闭。这种临时表的命名与非临时表可以同名(同名后非临时表将对当前会话不可见,直到临时表被删除)。内部临时表内部临时表是一种特殊轻
量
级的临时表,用来进行性能优化。这种临时表会被MySQL自动创建并用来存储某些操作...
MySQL
56,679
社区成员
56,709
社区内容
发帖
与我相关
我的任务
MySQL
MySQL相关内容讨论专区
复制链接
扫一扫
分享
社区描述
MySQL相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章