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