当前位置: 首页 > news >正文

【沉浸式解决问题】优化MySQL中多表union速度慢的问题

目录

  • 一、问题描述
  • 二、场景还原
    • 1. 数据库表
    • 2. 查询sql
  • 三、解决方案
    • 1. 索引
    • 2. 视图
    • 3. 分组
    • 4. 并行
  • 后记

一、问题描述

同事要实现一个搜索指标名称的关键词,然后按年份统计数量的接口,跟我说时间太长查不出来,无法实现,所以我上手解决一下。


二、场景还原

1. 数据库表

数据按省进行了分库存储,每个库5-6个省表,每张表目前大约两千万的数据量
在这里插入图片描述

2. 查询sql

先简单写个sql实现需求,这里先不考虑查询的关键词,逻辑就是把每一张表里面的数量按年份count统计,通过union拼接起来,再次按年份SUM求和。

SELECT y, SUM(c) 
FROM (
SELECT `year` y, count(*) c FROM guangdong_data_queries GROUP BY `year`
UNION ALL
SELECT `year`, count(*) FROM guangxi_data_queries GROUP BY `year`
UNION ALL
SELECT `year`, count(*) FROM hainan_data_queries GROUP BY `year`
UNION ALL
SELECT `year`, count(*) FROM henan_data_queries GROUP BY `year`
UNION ALL
SELECT `year`, count(*) FROM hubei_data_queries GROUP BY `year`
UNION ALL
SELECT `year`, count(*) FROM hunan_data_queries GROUP BY `year`
) AS a
GROUP BY a.y

三、解决方案

1. 索引

mysql优化第一步,增加索引
查看了一下,果然原表都没有索引,给year和指标名称增加后快了很多,由于是补记录的,忘记当时具体时间了

2. 视图

索引加完了就该考虑减少查询的数据量了
像这种模糊查询然后统计数量的,实际上可以先按照查询字段和统计字段分组,然后统计存到一个视图或者新的表里,提前隐藏掉其他的分类维度以实现缩小数据量,我这个表里面还有地区等分类字段,2000w的数据按指标名称和年份分组后就只有200w了,以后即使是模糊查询也是从这200w的基础上进行查询。

原理就是之前是先模糊匹配再去重,现在是先去重再模糊匹配,把指标名称相同但是年份不同的数据提前统计了,当然就快了,适用于数据不是实时变化更新的,我这个是以前的指标数据,正好符合。

当然,别忘记加索引哦

3. 分组

还能再优化吗,可以的!
可以考虑把上一步生成的结果,再次按年份进行分组统计数量,把年份及对应数量以json的格式存到一个字段,例如

{2024:10002023:9002022:800
}

这样可以使模糊查询的表再次缩小,假设每个指标平均涉及20个年份,那么查询的数据表大小就只有10w了,模糊匹配就很简单了,之后在内存中把年份统计字段取出来,遍历按年份加起来,相当于把最终要的统计数据提前计算出来了,同样的还可以把其他分类统计字段也存到一个字段里

4. 并行

还可以再优化吗?可以的!而且是很大的优化!
那就是union本身的执行的是串行的(【沉浸式解决问题】Mysql中union连接的子查询是否并行执行),而在连接的子查询非常多的时候,这无疑是致命的,可以通过多线程创建多个连接分别进行查询,在内存中合并最终结果,只要数据库扛得住,就能把速度优化到一个查询的时间!!!


后记

sql优化还有很多的方法和技巧,除了sql本身,也要更多的考虑业务端的优化。


喜欢的点个关注吧><!祝你永无bug!

/*_ooOoo_o8888888o88" . "88(| -_- |)O\  =  /O____/`---'\____.'  \\|     |//  `./  \\|||  :  |||//  \/  _||||| -:- |||||-  \|   | \\\  -  /// |   || \_|  ''\---/''  |   |\  .-\__  `-`  ___/-. /___`. .'  /--.--\  `. . __."" '<  `.___\_<|>_/___.'  >'"".| | :  `- \`.;`\ _ /`;.`/ - ` : | |\  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^佛祖保佑       永无BUG
*/

相关文章:

  • 数字化零售如何全面优化顾客体验
  • 深度融合数智化,百胜软件联合华为云加速零售行业转型升级
  • 删除大表数据注意事项
  • 字符操作函数续上
  • Vue 实现图片裁剪功能:基于 vue-cropper 和 Element Plus 的完整解决方案
  • AI Agent学习 -- (2)LangChain的安装
  • 全面探索 KingbaseES 在线数据库平台:从开发到优化的全方位体验
  • ROS学习话题通信之Python实现
  • C++ 学习 多线程 2025年6月17日18:41:30
  • 基于深度学习的智能语音情感分析系统:技术与实践
  • [Think] Libuv | Node.js | nix vs docker
  • Redis 核心数据类型及典型使用场景详解
  • HTTP 请求中的 `Content-Type` 类型详解及前后端示例(Vue + Spring Boot)
  • Stripformer: Strip Transformer for Fast Image Deblurring论文阅读
  • c++学习-多态
  • 从零到一:C语言基础入门学习路线与核心知识点全解析
  • Redis的GEO详解
  • 82.多级抽取滤波器,设计抗混叠滤波器时采样频率是基于抽取之前的设计的
  • Lua基础复习之Lua元表
  • C++——基础知识
  • 网站头部设计/网络整合营销策划书
  • 成都 网站改版/海外推广代理公司
  • jsp网站开发登陆/手机百度如何发布广告
  • 江西软件职业技术大学/百度关键词优化送网站
  • 网站建设先进技术/直通车怎么开才有效果
  • 北京微信网站建设公司/优化网站首页