日志监控系统中,大批量查询mysql方案
2023-09-11 14:19:37 时间
最近开发遇到一个问题:需要查询一个大时间段内的数据,分1000个小段,即为1000个点。X轴是时间,Y轴是该小时间段内统计后数据。注意:数据返回是一个list,其中每个对象返回值都是该小时间段内数据统计出来的,且需要根据入参顺序返回(这样前端展示就方便)。举例,查询12点到1点的数据,查询频率是30分钟,那么就需要查询11:30-12:00,12:00-12:30,12:30-1:00这三段数据(因为监控系统都是查询过去的数据,所以12点的那个值应该是之前半个小时的)。问题来了,
方案一:直接热查数据库,1000次,最终30s+,淘汰!
方案二:由于多次查库,1000次肯定耗时多,所以采用一次查库,把条件凭借成一个sql,用union all 把每个小时间段查询出来的数据并集,耗时20S,且存在sql过长报错的问题(默认1M)
方案三:直接查询一个大时间段的数据,不统计,直接把库内数据返回,在代码中(即内存中)遍历一遍返回list,对每一个实体,遍历时间段,把这个实体匹配到这个时间段内,map(key,List),key是段号,List存该时间段内的实体。最终统计每个时间段内的数据。第三种方案,耗时1-2秒,再次证明了耗时IO>内存的真理。其中这里有一个细节:为了保证返回数据有序(时间段先后),这里map采用了TreeMap,自然排序即可。
相关文章
- Error connecting to database [Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)]
- mysql-介绍、MySQL部署、数据类型、存储引擎
- 【MySql】mysql 慢日志查询工具之mysqldumpslow
- 统一观测丨如何使用 Prometheus 监控 MySQL
- MYSQL数据库优化
- 【问题解决方案】MySQL安装后无法启动-net start mysql服务名无效
- MySQL运维---多实例
- MYSQL错误解决:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
- 【问题解决方案】MySQL安装后无法启动-net start mysql服务名无效
- MySQL · 答疑释惑 · GTID下auto_position=0时数据不一致
- MySQL数据库查询优化技巧
- MySQL事务隔离级别理解_解读MYSQL的可重复读、幻读及实现原理
- MySQL索引下推视频讲解
- 〖Python 数据库开发实战 - MySQL篇⑳〗- 数据表的内连接
- mysql数据库(5): 创建表
- ERROR 3009 (HY000): Column count of mysql.user is wrong. Expected 45, found 43. Created with MySQL 5
- mysql_10 _ MySQL为什么有时候会选错索引?
- MySQL----CentOS7系统安装部署MySQL
- Mysql报错:Can't connect to local MySQL server through socket '/tmp/mysql.sock'
- Mysql之mysqlslap工具
- 10_Influxdb+Grafana监控Mysql
- MySQL 配置, 避坑 sqlyog连接mysql错误码2058
- MySQL_12_ShardingJDBC实现读写分离与分布式事务