一次sql优化和业务场景优化的记录

一次sql优化和业务场景优化的记录:

1.测试场景及问题描述:

–对接cmp容器管理平台,需要将我方系统采集到的容器资源指标信息,以5分钟为颗粒度发送至cmp对应的接口,大致的处理逻辑为:

—原始指标采集,分析,落库;;

—定时任务执行sql查询,并过滤出对应指标,查询出最近5min的结果,(basic_tsdb大宽表,行极多)不到4亿数据

—转化成对应的接口格式,通过接口反馈给cmp系统;

–问题:(1)kafka对应消费组消费堆积;(2)定时任务执行时,sql报错执行超时,影响对应接口获取不到数据

2.分析及解决问题思路:

针对问题(1):

—查看了各节点的消费堆积分布,排除了偏移量不均问题;

—查看了sink(消费者)日志,没有明显报错,排除功能影响导致数据不能入库问题;

—查看了ck(数据库)状态,及磁盘读写负载,没有看到明显瓶颈,排除资源问题;

因此推测为消费能力没有得到完全释放:

故增大了消费者的task属性值(提高消费线程,使task数=topic*partitions数量);

重建了kafka-topic,清除已堆积的数据;

修改了collector(数据收集器)的采集上报频率,由5s增大至1min(求稳);

针对问题(2):

—直接把sql在客户端执行了一遍,30s超时(客户端默认配置),推测为数据库性能问题或sql问题;

—查看sql,没有select*等小白问题,存在字符串转换函数,关联查询,分组,过滤等

—查看数据库cpu使用情况(ck特性为查询默认消耗所在机器一半的CPU核数,功能环境adb未和产品组件拆分部署,存在资源争抢),60%左右,没有达到瓶颈;

—鉴于和开发说了sql问题,他不认,使用了ck的解析计划,分析了sql执行过程:(几乎全表扫描,就查出了35条)

优化前的sql查询效率及过滤数据总行数

优化思路:先通过时间范围和系统id缩小结果集,再过滤全部指标

优化后:优化后的sql查询效率及过滤总行数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以考虑以下几个优化方法: 1. 使用索引:在 `table1` 和 `table2` 中的关联字段上创建索引,可以加快查询速度。 2. 使用 INNER JOIN:使用 INNER JOIN 可以将两个表的数据合并在一起,避免了多次查询。 3. 选择需要查询的列:只选择需要的列,避免不必要的数据传输和处理。 优化后的 SQL 可能如下所示: ``` SELECT t1.col1, t2.col2 FROM table1 t1 INNER JOIN table2 t2 ON t1.id = t2.id WHERE t1.col3 = 'xxx' AND t2.col4 = 'yyy'; ``` 注意:具体的优化方案需要根据数据表结构、数据量、索引情况等因素来确定,以上仅是一些常见的优化方法。 ### 回答2: 为了将上面的SQL进行优化,可以采取以下措施: 1. 索引优化:根据查询语句中经常使用的WHERE条件、连接条件和排序条件创建合适的索引。如果表中的数据量较大,可以使用分区索引来加速查询操作。 2. 使用JOIN优化:如果查询涉及多个表的连接操作,可以考虑使用INNER JOIN、LEFT JOIN等关联操作来减少数据的读取次数,提高查询效率。 3. 避免使用%通配符:在查询语句中使用%通配符会导致全表扫描,建议尽量避免使用%通配符进行查询,而是根据具体需求使用等值查询或范围查询。 4. 子查询优化:对于存在子查询的情况,可以考虑将子查询转化为JOIN操作,以减少查询的复杂度。 5. 避免使用SELECT *:在查询语句中,尽量指定需要查询的字段,而不是使用SELECT *,这样可以避免读取不必要的字段,提高查询效率。 6. 优化表结构:根据业务需求,调整表结构,尽量避免使用过多的冗余字段或者无用字段,减少数据的存储空间和磁盘IO。 7. 控制查询数据量:根据具体需求,合理设置查询的起始位置和查询的记录数,在需要分页查询时,使用LIMIT语句限制返回的数据量,避免一次性查询大量数据。 通过以上的优化措施,可以使得查询语句的执行效率得到提升,减少系统资源的占用,从而使得SQL查询更加高效。 ### 回答3: 要将上述的SQL进行优化,我会建议采取以下几个步骤: 1. 使用合适的索引:首先,对于主要用于过滤和连接的列,为其创建索引,以提高查询的性能。例如,如果order表中的order_id是主键列,可以为其创建主键索引。同时,根据查询的需求,也可以创建其他列的索引来加速查询操作。 2. 优化查询语句:检查查询语句,确保它使用了高效的操作符和连接方式。可以考虑使用JOIN操作来代替子查询,以减少查询的复杂性和提高执行速度。 3. 减少查询返回的行数:只选择需要的列,避免使用“SELECT *”来返回所有列。同时,可以使用LIMIT关键字来限制返回的行数,减少数据的传输量,提高查询性能。 4. 重新考虑表结构设计:如果查询的表存在大量无用或冗余的列,可以考虑进行表结构设计的优化,尽可能地将相关的列放在同一个表中,减少数据的存储和读取开销。 5. 缓存查询结果:如果查询的结果是经常被使用的,可以将其缓存起来,避免每次查询都要重新计算,提高查询的响应速度。 总之,SQL优化需要结合具体的应用场景数据库结构来进行,以上仅是一些常见的优化策略。根据具体场景,还可以考虑使用数据库中的性能调优工具,如索引优化工具、查询执行计划分析工具等,来帮助找到潜在的性能问题并进行针对性的优化

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值