zoukankan      html  css  js  c++  java
  • 记一次在获取mysql数据库结果集时的优化

    【背景】

            该项目是用C++实现的一个处于数据库和应用服务之间的分库分表路由服务的组件。

    • 层次结构

    • 主要功能

    1)与数据库维持长连接

    2)根据不同分库分表规则选择sql路由,为上游提供透明的sql查询服务and定制化接口

    3)sql执行的检查,防sql注入、防全表扫描等

    • 问题

            在对服务性能进行评估时发现,当压力不断增加时,sql执行耗时并没有太大变化,反而是获取sql执行结果集and将结果集转json格式耗时越来越大。

    【猜想】

    • 获取mysql结果集部分时使用的api效率问题,从getXXX(column_name)换成getXXX(index)

    官方文档介绍通过属性名访问更清晰,但通过index访问效率更高。

     

    • 使用的jsoncpp库实现的转json效率太低

    解析和生成JSON的耗时(越低越好):(图片来自于Milo Yip的知乎回答:https://www.zhihu.com/question/23654513)

    可以看到jsoncpp耗时为171ms,而rapidjson耗时为13ms,只有不到jsoncpp的1/10

    【压测】

    环境:

    并发128连接

    结果:

      case1:优化前 case2:采用index方式获取结果值 case3:优化取结果逻辑 case4:用rapidjson替换jsoncpp
    总耗时(ms) 164 102 49.3 2.8
    获取结果集耗时(ms) 73 27 8.1 1.6
    转json耗时(ms) 65 47 40.7 0.8

    【效果】

    三个接口a、b、c在优化后的效果对比,如下:

     

    【结论】

            rapidjson相对于jsoncpp,单纯从转换的性能上来说,确实提升了很多。

  • 相关阅读:
    jackson 解析json含有不规则的属性的json字符串的方法
    swift入门-实现简单的登录界面
    github git.exe位置
    linux之SQL语句简明教程---IN
    怎么样才算是精通 C++?
    BZOJ2028: [SHOI2009]会场预约(set)
    BZOJ1058: [ZJOI2007]报表统计(set)
    洛谷P2391 白雪皑皑(并查集)
    BZOJ4514: [Sdoi2016]数字配对(费用流)
    BZOJ3143: [Hnoi2013]游走(期望DP 高斯消元)
  • 原文地址:https://www.cnblogs.com/taoxinrui/p/6398969.html
Copyright © 2011-2022 走看看