mysql优化返回多条数据_c++,mysql_C++读mysql数据表,遍历结果集然后返回Domain对象的list,一万条记录竟然需要3秒多,应该怎样优化?,c++,mysql,性能优化 - ph...

C++程序通过mysqlpp库查询MySQL数据库一万条记录,耗时3秒多。主要瓶颈在于将结果集转换为Domain对象。优化方案包括:批量获取字段名、预编译SQL语句、减少字符串比较和使用映射表提高赋值效率。
摘要由CSDN通过智能技术生成

C++读mysql数据表,遍历结果集然后返回Domain对象的list,一万条记录竟然需要3秒多,应该怎样优化?

这个函数要完成的任务是:

利用mysqlpp查询出结果集,然后遍历每一行记录,生成一个Domain对象,放到list中,最后返回一个Domain对象的list。

在做测试的时候,发现遍历一万条数据竟然需要3秒多……所以请大家帮忙把把脉,看应该如何优化:

完整的while循环,计时:3.338秒

注释掉第10行,计时:1.174秒

注释掉7-11行,计时:1.193秒

代码:

1. Connection* conn = ConnPool::getSingletonPtr()->getConn();

2. Query qr = conn->query(sql);

3. UseResult res = qr.use();

​// 开始计时

4. while(Row row = res.fetch_row()) // 循环10000条记录

5. {

6. Domain obj;

7. for(int i=0; i

8. {

9. // 调用Domain的成员函数,为Domain对象赋值

10. obj.setValue(res.fetch_field(i).name(), row[i]);

11. }

12. objList->push_back(obj);

13.}

// 结束计时

Domain类中定义这么一堆属性:

int procedureNo;

int index;

int employeeNo;

int procCount;

int state;

int procPermission;

int procDeadline;

int advanceAlert;

DateTime procTime;

int resultFlag;

string comment;

int flowDirection;

int isHideComment;

int isTrack;

DateTime arriveTime;

string preNodesJsonStr;

string nextNodesJsonStr;

string attachStr;

string employeeName;

DateTime employeeBirthDay;

上面第10行用到的成员函数定义如下(之所以用这个函数,是因为数据表中的字段名和Domain类的属性名并不一致)

void Domain::setValue(const char * colName, const Element& ele)

{

if(strcmp(colName,"column010") == 0)

procedureNo = ele;

else if(strcmp(colName,"column020") == 0)

index = ele;

else if(strcmp(colName,"column030") == 0)

employeeNo = ele;

else if(strcmp(colName,"column040") == 0)

procCount = ele;

else if(strcmp(colName,"column050") == 0)

state = ele;

else if(strcmp(colName,"column060") == 0)

procPermission = ele;

else if(strcmp(colName,"column070") == 0)

procDeadline = ele;

else if(strcmp(colName,"column080") == 0)

advanceAlert = ele;

else if(strcmp(colName,"column090") == 0)

procTime = ele;

else if(strcmp(colName,"column100") == 0)

resultFlag = ele;

else if(strcmp(colName,"column110") == 0)

comment = ele;

else if(strcmp(colName,"column120") == 0)

flowDirection = ele;

else if(strcmp(colName,"column130") == 0)

isHideComment = ele;

else if(strcmp(colName,"column140") == 0)

isTrack = ele;

else if(strcmp(colName,"column150") == 0)

arriveTime = ele;

else if(strcmp(colName,"column160") == 0)

preNodesJsonStr = ele;

else if(strcmp(colName,"column170") == 0)

nextNodesJsonStr = ele;

else if(strcmp(colName,"column180") == 0)

attachStr = ele;

else if(strcmp(colName,"column190") == 0)

employeeName = ele;

else if(strcmp(colName,"column200") == 0)

employeeBirthDay = ele;

}

相关阅读:

git merge的时候总是会有一条commit message,请问这是操作不当吗?

react native windows环境搭建的问题

rbac没权限返回如何判断跳转到页面还是ajax返回

在iOS7用actionSheet发现位置错乱了!

ios 怎么在状态栏显示视图

mobaxterm打开vim输入中文只能一个一个输入.比如打出一个4字词只有一个能在vim中输入.可能还会出现另外的字

webpack编译handlebars的问题

python3使用pymysql遇到编码是lanti1,如何插入数据?

mysql对client发过来的字符处理流程?

Ubuntu 64位下添加系统调用,系统注册表需要修改的是syscall_64.tbl吗

mongoose如何取得全部结果数量并只提取部分结果

Android AppWidget 不能显示图片 只显示背景

全局变量 undefined 可以被重写应该怎么理解

域名绑定最多绑定几个

js可不可以定义css animation的时间?

后台发布的活动前台页面样式改变了

Android PinnedHeaderListView如何切换(定位)到某一个Header?

git团队开发?

DOM的核心作用是动态的更新html页面吗

windows平台git每次都会出现莫名其妙的许多changs,但是对比后又没有发现不同

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值