关于sql和后台服务优化分析建议

本文详述了SQL优化,包括索引字段、返回必要列、动态条件、count使用和分页策略;业务层优化,如数据遍历、缓存使用;还提及了Gzip压缩和前端缓存技术,旨在提升服务性能。
摘要由CSDN通过智能技术生成

之前都是话不多说上代码,今天回顾下开发中遇到的性能问题以及优化方案思路,把之前做C#和java的服务和数据库优化的内容整理归纳到一起,,详细讲一下吧,希望对大家有帮助。

有错误和问题的地方请指正,有更好的想法和补充可以评论,共同学习共同进步~

分析以及优化方案

SQL优化

索引字段

      大部分场景还是使用了无索引字段作为主要过滤条件导致性能下降。数据库里加索引可以高效获取数据。(不知道怎么用索引的自己再去搜搜看看)

返回必要的列

     尽量不要使用select(*),只查询需要用到的列

动态条件

     in 查询参数过多导致索引性能下降的场景,建议控制在某个参数范围内

     少使用or,用in代替或者多层 or 的情况建议使用union 

     使用合适的join,inner 和left的情况区分,使用inner join可以减少查询数据量

     多表联查先过滤条件在联查,可以使用子查询,避免全局扫描

count使用

     高频的count查询,很多时候没注意就直接用的count(*),建议使用count(column_name)

分页优化

    1.LIMIT/OFFSET 子句:使用LIMIT限制返回的数量,并使用OFFSET指定从第几条记录开始获取

     2.ROWNUM(Oracle)或ROW_NUMBER() OVER (ORDER BY)(MySQL、PostgreSQL等):这种方式利用了特定数据库系统自身的功能来实现分页

     3.先根据条件筛选数据,然后根据某个字段作为row_num,取row_num>start and row_num<end的区间数据
     4.使用存储过程或者视图:将分页查询逻辑放入存储过程或视图中,可以提高查询的安全性和可维护性

碎片化整理

    定期对数据库进行碎片化整理,资源回收

 

业务层优化

数据遍历

    减少循环次数,考虑下哪种遍历效率高,比如for和foreach,或者集合自带的list.foreach(c#)或者list.stream().foreach(java)等等

  • LINQ循环遍历示例(C#代码)

想把扩展表的数据拼接到主表上,第一版优化就用了缓存,然后集合转字典,再用foreach循环遍历然后把节点附上去

//声明一个结果集的集合对象
List<WsmpObjectOutput> result = new List<WsmpObjectOutput>();
//以下都是从缓存里面读取的数据
IEnumerable<WsmpObjectExtend> allextend = SelectAllExtend();
WsmpLayerRepository layerRepo = new WsmpLayerRepository();
var dicLayer = layerRepo.SelectAll().ToDictionary(a => a.LayerId);//把集合数据转成字典方便获取
var dicIndicator=GetIndicators();//把集合数据转成字典方便获取
if (allextend.Count() > 0)
{
    foreach (var extend in allextend)//遍历对象集合
    {
        var output = new WsmpObjectOutput(extend);
        //获取对象的图层信息
        if (dicLayer != null)
            output.Layer = dicLayer.ContainsKey(output.LayerId) ? dicLayer[output.LayerId] : null;
        //获取对象的指标信息
        if (dicIndicator != null)
            output.Indicators = dicIndicator.ContainsKey(output.ObjectId) ? dicIndicator[output.ObjectId] : new List<WsmpIndicatorOutput>();
        result.Add(output);
    }
}
return result;

效率提高了一些,发现数据量很大的情况下,转成字典数据也挺慢,就考虑用LINQ语法,复杂的逻辑简单化,更灵活,还能一眼就能看清晰,更便于维护。场景用的合适当然也能提高性能,复杂的这段我测试过,确实请求的时间快了一点。

//声明一个结果集的集合对象
WsmpLayerRepository layerRepo = new WsmpLayerRepository();
WsmpIndicatorRepository indRepo = new WsmpIndicatorRepository();
//从缓存里取出集合数据
IEnumerable<WsmpLayer> allLayers = layerRepo.SelectAll();
IEnumerable<WsmpIndicatorOutput&g
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

姗姗的鱼尾喵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值