最近忙的小模块小结

今天总算是可以腾出一点时间,来写点最近忙的事,做个小总结。

这次做的项目是将数据库的数据进行查询,统计并显示在界面。

前提:

1.利用mysql数据库实现在线查询统计

2.数据库涉多张表(将原先一张表的数据分开),利用ID的形式进行对接

3.数据量较大,涉及一万多行的资料,如果表按ID合并也有100多列,所以数据实际上百万数量级

4.使用CBCGPGridCtrl显示数据,且可利用CTreeCtrl的勾选对表的每一列数据是否显示进行选择,且记忆用户的选择


刚开始做的时候,用的是一个Demo数据库,数据量小,也没有考虑到数据量大了效率的问题,所以用法简单但是想法复杂,利用容器存储数据库数据,然后遍历显示数据,这边因为数据是存在多张表中的,所以这边多余获取所有的数据并且保证每条数据的正确性费了很大的劲。花了大概一周多的时候几个模块逻辑上已经走通。连接服务器,真正的大数据来了,完了,挂了,查询功能已经是分钟级,统计显示也是秒20+,怎么办?纠结了一天,期间问题导师问同事,寻求解决方案,因为之前我压根就没接触这块,没有任何经验,当时真觉得修一门软件设计思想是多么迫切,不像我这半路杀出来的coding半吊子...

纠结的第二天,有了一个大概的思路,但是实现的细节需要验证。

具体解决方案:

1.直接使用sql语句进行查询,之前使用的是一套ld定义的接口,直接返回一个容器值

2.尽量减少容器的使用,减少使用容器是因为在大数据情况下,容器的效率会大大降低,1万行几十列的数据要达到秒级,而使用sql语句却只需百分之一秒

3.对于CBCGPGridCtrl使用虚表,list控件SetValue其实是一个耗时的动作,对于在100万格的list表setvalue需要耗去十几秒的时间,而BCG列表控件正好有虚表的属性,进行设置,并使用一个回调函数就好了。

4.将树控件勾选信息存在本地db数据库中,初始化时直接读取db数据库的数据,另外显示时,显示所有列的信息,只不过做了一个处理,对于未勾选的项,列宽就设为0

BCG虚表的使用方法:

//声明

static BOOL CALLBACK queryThreadProc(BCGPGRID_DISPINFO* pdi, LPARAM LP);

//属性设置
m_listPhoneInfo.EnableVirtualMode(queryThreadProc, (LPARAM)this); //queryThreadProc即为回调函数,参数二传入this指针
m_listPhoneInfo.SetVirtualRows(m_vecMobInfo.size()); //m_vecMobInfo.size()即为总共需要插入的行数


//回调函数,用于插入手机信息
BOOL CPhoneInfoDlg::queryThreadProc(BCGPGRID_DISPINFO* pdi, LPARAM lp)
{
ASSERT(pdi != NULL);
CPhoneInfoDlg* pThis = (CPhoneInfoDlg*)lp; //利用this指针调用对话框成员
int nRow = pdi->item.nRow;
  int nCol = pdi->item.nCol;

CString str = _T("");


if (-1 != nCol && nCol < pThis->m_vecMobInfo.at(nRow).size())
{

//赋值
str = pThis->m_vecMobInfo.at(nRow).at(nCol);
pdi->item.varValue = (LPCTSTR)str;
}
return TRUE;
}


/**************************************/


另外体验到sql的语句的强大,效率之高。对于一个没有系统学习sql的同学真是受益不少...

//使用定义的方式链接几张表,并利用ID进行一一对应

1.select--from:需要显示的列字段,当然可以用*,则显示所有表字段;from--where:定义需要链接的表;where--:利用ID进行一一对应
select c.Deviceinfo,d.email,d.weibo,d.installlog,e.contacts from mffrsclogic a,mfphonebaseinfo b,mffrscbaseitem c,mffrscapp d,mffrscdelrecovery e
where a.logicid = b.baseinfoid and c.baseitemid = a.baseitemid and d.appid = a.appid and a.delrecoveryid = e.delrecoveryid and f.baseinfoid = a.logicid 


2. like关键字的使用

select * from mfphonebaseinfo where os like 'android' //此时like与=号的用法一致,没有模糊匹配

select * from mfphonebaseinfo where os like '%android%' //此时查询的就是含android字段的结果,进行了模糊匹配


另外说明以上两个语句是在sql工具中的写法,如果是代码,使用%s则应该写成:

(_T("select * from mfphonebaseinfo where os like '%s' "), strTmp)

(_T("select * from mfphonebaseinfo where os like '%%%s%%' "), strTmp)


也可以写成:

(_T("select * from mfphonebaseinfo where os like \"%s\" "), strTmp)

(_T("select * from mfphonebaseinfo where os like \"%%%s%%\" "), strTmp)

3.区间范围查询

可以使用<=,>=或者between..and...

经过两天左右的优化,查询速率不到一秒,对所有数据进行统计并显示也只需花4-5秒的以内的时间,好的服务器,1-2秒即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值