之前都是话不多说上代码,今天回顾下开发中遇到的性能问题以及优化方案思路,把之前做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