首页 新闻 会员 周边

联表查询的优化问题

0
悬赏园豆:5 [已解决问题] 解决于 2008-06-12 12:25
比如现在社区里面有一项叫"朋友的评论"这样一个列表. 数据库表结构如下:<br><br>t_comment<br><br>id&nbsp; uid(创建人,外键) content createddate<br><br>t_friend<br>id uid(用户ID,外键) fid(朋友ID,外键)<br><br>t_user<br><br>uid uname email<br><br><br>现在希望得到 最新的20条朋友评论 应该如何写?<br><br>如果这里已经有了朋友的列表, 比如数据是这样的: "213,235,356,3564"朋友的ID用分隔符分开,&nbsp; 这种情况下不使用联表查询,效率相差多少?<br>
问题补充: 这样的联表查询也可以用视图来做,与直接联表查询相比有什么优缺点?效率差异如何?
沙加的主页 沙加 | 老鸟四级 | 园豆:3680
提问于:2008-03-29 09:56
< >
分享
最佳答案
0
如果表的结构确实如此简单,使用的不是非常古老(比如2000年以前发布的版本)的DBMS,并且数据库与Web服务器在同一台计算机上的话,不管使用inner join还是in等任何方式,联表查询与否对效率应该基本不会造成可以观测到的影响. 但是如果数据库在另一台计算机上,每次查询都会有的网络延迟就会让联表查询大大地优于1+N查询. 视图带来的唯一好处是让开发变得更简单,对性能则只会有所降低,不可能提升.这个与权限检查有关. 推荐实现方式: 1,每次只取一条/几条同一类型的数据,缓存起来.用的时候从缓存取,如果没有再从数据库里抓到缓存(推荐这种方式,既简单又实用,由于80/20原则的存在,通常性能不会比跨表查询低). 2,使用跨表查询,比如: select top 20 c.id, c.uid, c.content, c.createdate, f.fid, u.uname, u.email from t_comment c, t_friend f, t_user u, where c.uid = f.uid and u.uid = f.fid order by c.createdate desc
deerchao | 大侠五级 |园豆:8367 | 2008-04-01 00:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册