[待解决问题] 联表查询的优化问题
提问时间: 2008-03-29 09:56
悬赏分:5 该问题已到期 浏览:249 次
比如现在社区里面有一项叫"朋友的评论"这样一个列表. 数据库表结构如下:

t_comment

id  uid(创建人,外键) content createddate

t_friend
id uid(用户ID,外键) fid(朋友ID,外键)

t_user

uid uname email


现在希望得到 最新的20条朋友评论 应该如何写?

如果这里已经有了朋友的列表, 比如数据是这样的: "213,235,356,3564"朋友的ID用分隔符分开,  这种情况下不使用联表查询,效率相差多少?

提问者:沙加 - 老鸟四级

问题补充:这样的联表查询也可以用视图来做,与直接联表查询相比有什么优缺点?效率差异如何?

所有回答(1)
如果表的结构确实如此简单,使用的不是非常古老(比如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
1个月前   回答者:deerchao - 老鸟四级
   您需要登录以后才能回答!
我的问题    我要提问


快到期问题

> 问题排行榜

有不合适内容,建议去除