王朝网络
分享
 
 
 

在数据量和访问量剧增条件下保持数据库效率

王朝other·作者佚名  2008-08-14
宽屏版  字体: |||超大  

在某些网站里,你可以订阅好友,这样,好友发的消息就会出现在你的主页里,这种方式确实很人性化,但是就引出了一个疑问,他们应该如何组织数据库才能在很大的数据量和访问量下效率最高呢?

首先,数据库应该是这样的:(括号里是字段,其他无关信息省略)

用户表:user (uid, name), uid为主键。

信息表:msg (mid, uid, content), mid为主键,uid为发贴人。

好友表:friend (uid, fid), uid为主人,fid为好友(即uid订阅的人的id)。

这样,要查询出某人的所有好友的信息就可以这样写SQL语句:(已查询uid=1的为例)

1) SELECT * FROM msg, friend WHERE msg.uid=friend.fid AND friend.fid=1;

注意:千万不要写成:

2) SELECT * FROM msg WHERE uid IN (SELECT fid FROM friend WHERE uid=1);

子查询的方法比级联两张表慢了不止1个数量级!

(测试结果,方法1)能在10-30ms查询出结果,而方法2)则用了3min还没有出来结果)

有些人在网上说再增加一张中介表可以提高速度:

中介表:linker (uid, mid)

中介表是这样用的,每次当一个人发了一篇帖子,则将所有订阅他的人(uid)和这篇帖子的mid插入中介表里,例如,uid=1的人有3个订阅者,分别为:2、3、4,则当uid=1的人发了一篇帖子mid=100时,就应往linker表里插入这些数据:(2, 100), (3, 100), (4, 100)。这样,对一个uid而言,linker表和msg表就形成了一对一的关系。查询的时候,只需级联linker表和msg表就行了,如下:(还是以查uid=1的为例)

3) SELECT * FROM msg, linker WHERE msg.mid=linker.mid and linker.uid=1;

这样乍看好像比1)要快一些,因为就一个uid而言linker表和msg表是一对一的关系,而方法1)的却是一对多的关系。而且,有些人认为,就算不这么看,因为方法3)在插入时比方法1)多做了很多操作,所以查询的速度应该能比方法1)快,至少不会比方法1)慢。

我实际测试下来的结果是,方法3)比方法1)慢了至少1倍的时间,而且数据量越大,慢得就越多。测试结果:

a) user有10,000条,friend有160,000条,msg有80,000条时:平均查询时间:

方法1)是:0.04s,方法3)是0.08s,3)比1)慢1倍。

b) 当msg有260,000条时:方法1)是:0.18s,方法3)是:0.70s,3)比1)慢3倍。

(以上结果都是在建了索引之后的)

根据分析,3)比1)慢的原因,主要是当数据增大时,linker表的数据量急剧增大所致。因为当msg里有260,000条数据是,linker表的数据量已经超过4,000,000条了。

通过对这个的研究得出几点体会:

◆1、数据库对where的优化做得太好了(除了"in"关键字)。

◆2、索引对数据查询效率的影响是太大了,我开始测试的时候没有建索引,查询时间都在几百毫米,建了以后降低到几十毫米了。

◆3、不要随便相信网上的一些讨论,要通过自己学过的知识去验证网上讨论的对错。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有