union all查询慢,优化办法

6 篇文章 0 订阅
2 篇文章 0 订阅

如果有没理解的地方,点个关注,私信我就行哈~~,看到了会及时回复

2021-05-11更新一下,可以用分区表做这种按照时间和某些条件查询的案例,具体看我的另一篇博客
mysql分区表创建

先简单说一下我的项目,是一个购销存系统(这不重要)
由于数据量太大,所以每天都分一张表,一张表的数据量大概在18W样子,双十一这种节日能到60W数据样子一天。
其中要计算期初的语句
在这里插入图片描述
下面还有很多很多,语句很长。每次查一年的期初都要花很久,而且要求一次都查出来,数据量很大。
就是从一张表筛选出数据,然后疯狂union all,这就导致了查询的时间边长。
方法一:,如果你的union all很多的话,可以做成视图,相当于把所有的表数据合成一张表来显示。
但数据实际上还是分表存的,只是展示出来的结果让你看上去是一张表。相当于把union all这一层给提前做好了。这样查询的时候就只要控制某个字段是时间,比如date>'2019-03-05’这样子。
但是也有弊端 ,视图在查数据量较小的时候反而会慢很多,因为你查之前,需要时间把视图预编译,这个开销是很大的。所以这只适合在查数据量很大的时候。我是用视图把150秒的语句优化到了100秒。比如原本20秒的语句,我用视图查可能要查30秒。所以也要看情况用。存储过程我就不贴出来了,有兴趣的可以私,看到会及时回复。
我其实每次查询的时候group by也很费时间,建议在最外层写group by,把里边的group by都去掉。另外,尽量少用连表查询,我这个是没啥办法,当初一开始设计的时候没设计好,因为是刚毕业的第一个项目,经验不够。比如我每条查询语句中都连了一张shop表,主要是去shop表里取表名,这其实很不合理,我后来才意识到这一点。取表名可以用java代码做匹配,这样会很快。sql只用来取数据,需要连表查的能用java代码做匹配就用代码匹配。连表带来的开销会很大,会得不偿失。sql最快的情况是只用来做select,函数尽量少用,尤其是转换大小写的函数,千万避免。数据量小的时候你看不出差别,数据量一大,这个函数会特别耗时间。在mysql数据库中表现得特别明显。sqlserver中倒是没那么大的差异。但还是尽量在数据库里少用这种数据库函数。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
对于union all操作导致SQL解析缓的问题,可以采取以下优化方法: 1. 将多个union all操作合并为一个查询语句:根据引用中的建议,可以使用values子句将多个值直接作为一组数据,从而减少解析的次数。例如,将原来的多个union all操作替换为一个values子句,以减少SQL解析的开销。 2. 使用视图进行优化:根据引用中的建议,如果union all的数量较大,可以考虑将其转化为一个视图。视图相当于将所有的表数据合并成一个虚拟表来展示,从而减少union all的操作。需要注意的是,视图在查询小数据量时可能会有预编译的开销,因此这种方法适用于查询大数据量的情况。 3. 在最外层使用group by:根据引用中的建议,在查询语句中将group by放在最外层,去除内部的group by操作,可以提高查询性能。 4. 尽量减少连表查询:根据引用中的建议,尽量避免使用连表查询,特别是在大数据量的情况下。如果需要获取表名等信息,可以使用Java代码进行匹配,以减少数据库操作的开销。 5. 尽量减少使用数据库函数:根据引用中的建议,尽量避免使用数据库函数,特别是转换大小写的函数,因为这些函数在大数据量的情况下会消耗大量的时间。在MySQL数据库中尤其明显,可以考虑在数据库中尽量少用这种函数。 综上所述,对于union all操作优化可以考虑将多个union all操作合并、使用视图进行优化、在最外层使用group by、减少连表查询以及减少使用数据库函数等方法。根据具体情况选择合适的优化方法可以提高查询性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [不当使用 union all 导致的SQL解析时间过长的问题优化](https://blog.csdn.net/lyu1026/article/details/125195995)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [union all查询优化办法](https://blog.csdn.net/weixin_44388689/article/details/103893467)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RayCheungQT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值