免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8900 | 回复: 16
打印 上一主题 下一主题

[算法] 关于c程序入数据库的效率问题..有更好的办法吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-01 10:20 |只看该作者 |倒序浏览
大家好,我在做一个项目时,遇到了个问题,想求教下大家:

我的目的就是 :当手机通讯录更新时,我服务器这边能比较高效的完成数据库中相对应存储的通讯录也为最新。


我实现的大致流程是这样的:

假设当手机号为123456的手机通讯录进行了更新,  我服务器这边会触发一个操作A,即上传手机通讯录 ("上传"的含义即"放入本地数据库"):

A对数据库的基本流程如下:
{
     ....
    delete from XXX where phonenum ='123456';    //1.先到数据库中将此号码涉及到的通讯录进行删除.
    insert into xxx(...) values (新的通讯录);              //2.然后将新的通讯录进行插入.
}

============================
由于在进行操作数据库的时候,涉及到表的加锁解锁以及等待问题,因此如果同时n个人进行操作,会出现表的等待问题,影响后续其他操作。     //此处会导致效率变低。
另外,在对表的操作过程中,delete以及insert都是十分耗时的。                                                                                                //此处也会导致效率降低。

这个问题涉及到2个瓶颈:
1.因为手机通讯录的更改是随机的,也就是说 他有可能这次更新是增加了1条,也有可能是删除了1条,。所以我考虑了进行 ”先把之前的全部删除,然后把这次的全部插入“ 办法。
2.由于同时操作的人数很多而且几乎不断,也就是说,由于我多次频繁访问数据库的表,所以他们在操作的时候会面临数据库的压力比较大,而且表的加锁等待问题严重。


可是以我上述的思路来讲,我这样的效率特别慢。。 希望哪位有好想法的,或者有过此类经验的朋友 帮忙解答下,感激不尽。。谢谢谢谢!!

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
2 [报告]
发表于 2013-08-01 10:43 |只看该作者
怕什么, 手机通讯录改动会很多么? 或者就直接用key-value系统
另外操作数据库, 用innodb只是锁行, 不会锁全表, 也不会出现N个人就会很慢.
如果数据量大,分区或者分表都是不错的选择.

读量大的, 把db的cache设得更大一些就可以了.

最好的解决办法是用纯内存的key-value系统.

论坛徽章:
0
3 [报告]
发表于 2013-08-01 10:47 |只看该作者
对于你说的第一个“瓶颈”我想到的是:给表添加一个时间戳字段,然后采用“INSERT ... 时间戳 ON DUPLICATE KEY UPDATE ... 更新时间戳”,时间戳最新的是有效记录,否则是无效记录(找个时间统一清理或保留都行,数据很值钱啊)

论坛徽章:
0
4 [报告]
发表于 2013-08-01 10:59 |只看该作者
第二个的话,把记录缓存在内存中(模拟操作系统的页面置换算法),效果应该不错

论坛徽章:
0
5 [报告]
发表于 2013-08-01 11:26 |只看该作者
回复 2# hanxin83


你好,谢谢你的建议。。在测试那边进行压力测试的时候,这个确实挺慢的。现在我已经分表来缓冲压力。

key_value系统我之前想到过,但是它不利于后面的通讯录之间匹配好友的使用,所以暂时还是考虑存至mysql库中了。
//这个后续使用,1楼我没提到,不好意思哈。。。

1个手机的好友有可能成百上千,而他存到一个数据库的记录也就是成百上千,  而每次更新时,由此产生的delete+insert 会触动到成百上千的数据量。
当很多用户同时更新时,所耗时也是有点接受不了的。。
而且这个问题导致 数据库的压力特别大,数据量大,而且访问很频繁。 //我个人感觉,只要涉及到数据库的操作,程序效率总会相应的变低..因此希望能尽量减少数据库的访问就少点。。

因为我在想,有的时候 假设用户有1000个好友,只是删除了1条好友,那么我这边的处理就是先删除表中1000个此号的好友记录,然后将此次的999条好友insert。。
这样有点太浪费了,但是我还没想到其他办法。。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
6 [报告]
发表于 2013-08-01 11:53 |只看该作者
换kv存储, key是谁, value是序列化其通讯录.

redis比较适合你, 直接有Hash

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-23 06:20:00
7 [报告]
发表于 2013-08-01 18:54 |只看该作者
通讯录通常的操作是delete item, insert item, 数据应该在客户端就进行控制只上传update的items.

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
8 [报告]
发表于 2013-08-02 16:41 |只看该作者
本帖最后由 yulihua49 于 2013-08-02 16:54 编辑
BuTa丶潇 发表于 2013-08-01 10:20
大家好,我在做一个项目时,遇到了个问题,想求教下大家:

我的目的就是 :当手机通讯录更新时,我服务器这 ...

是ORACLE吗?
注意使用绑定变量,而不要使用直接值,使数据库软解析,速度可以上一个数量级。
把参数交给存储过程做,还可以实现软软解析。
弄过一个OCI的多线程并行批量操作,性能比上面高。
专门一组线程,每个线程事先打开数据库,准备好删除游标和修改游标,守护一个队列,得到数据后仅excute(游标一直保持,所以完全不解析语句)。
比你原来的程序应该有两个数量级的性能。条件当然是建立了合适的索引。
这个太复杂,估计你玩不了。

论坛徽章:
1
白羊座
日期:2013-08-20 17:40:23
9 [报告]
发表于 2013-08-02 17:36 |只看该作者
6L说的就比较适合啊,将表缓存到redis,
直接操作redis,再定时或者其他什么策略将redis
的数据和表同步,那样效率就很高了

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
10 [报告]
发表于 2013-08-08 14:22 |只看该作者
cgcym1234 发表于 2013-08-02 17:36
6L说的就比较适合啊,将表缓存到redis,
直接操作redis,再定时或者其他什么策略将redis
的数据和表同步, ...

你没看清楼主的题目。
更新通讯录,你在内存折腾,不及时写到数据库,有屁用啊。
需要查找通讯录的有很多,不一定在你这个进程里。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP