美文网首页
培训列表页性能优化报告

培训列表页性能优化报告

作者: detry | 来源:发表于2016-06-14 11:02 被阅读70次

响应时间和访问量

访问量 响应时间
  • 访问量高峰期过万,平时日访问量过千
  • 高峰期响应时间 400~1000ms,平时400ms
  • 2台服务器
  • 500+行代码

代码结构问题

  • 内部耦合性强,内聚性差
  • 可读性差,注释少
  • 代码质量差,潜伏bug多,出问题难以排查

优化目标

  • 优化响应时间,800ms较慢
  • 重构代码,加上必要注释,便于后期维护

性能优化

添加机器

mp_server_1 mp_server_2

分析:目前mobile-web两台机器,分析某一天(平常时候6月2号)机器,两台机器的CPU使用率,发现比较正常,没有过载的情况。五月底因为某一天访问量过高,CPU使用率一度升到40~60%。

优化方案:

  • 通读代码,发现很多循环SQL的情况,即根据列表ID,循环查询数据库,可以将这些合并为一次IO,一次查询尽可能多的数据(在网络不是瓶颈的情况下)

  • 不少方法内部逻辑类似,可以优化为一个方法

  • 不少大表没有建相应的索引,全表扫描缓慢,可以针对性的建索引


循环查询优化

循环查询的代码:

pro_循环查询.JPG

使用 sqlalchemy in_语句,用mysql in来一次性查询,减少IO次数。

pro_循环优化.JPG

完全没有优化的情况:

get_status_方法未优化.JPG

未优化时候,getTrainingListWithStatus方法耗时1400+ms,优化后,响应时间减少到1300+ms,减少了100多ms。

get_status_优化后.JPG
合并相同逻辑优化

获取培训列表方法getTrainingList中,内部有个代码片段,循环调用了两个内部逻辑大致相同的方法,多了一次IO,优化一下,可以减少一倍的耗时。

get_train_list_未优化.JPG get_train_list_重复逻辑的代码.JPG

可以合并为一个IO,然后作为参数传入这两个方法。

优化以后,get_train_list方法耗时从1000+ms降到500+ms,减少了一倍。

get_train_list优化以后.JPG
建索引优化:

培训列表涉及的数据表有:

  • transporter_training; //表数据总量508,一个city_id 有15-50条数据; 目前有一个 id 索引;拟在上面建city_id索引
  • transporter_training_course; //表数据总量19105,目前有id索引,teacher_id索引;拟在上面建(training_id,is_del)索引
  • transporter_training_signup; //表数据50多万,目前只有一个id索引;拟建(transporter_id,is_valid,training_type)索引
  • training_online;//表数据90多万,989802,目前只有一个id索引,为全表扫描;拟建 transporter_id 索引

添加索引后的优化情况

分析:添加索引后,整个training_list 耗时从1200+ms减少到890+ms。 可见添加索引后性能大大提升。


我的优化到此结束,谢谢!

相关文章

网友评论

      本文标题:培训列表页性能优化报告

      本文链接:https://www.haomeiwen.com/subject/hmwolttx.html