记一次在获取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,单纯从转换的性能上来说,确实提升了很多。

原文地址:https://www.cnblogs.com/taoxinrui/p/6398969.html