论坛首页 Java企业应用论坛

从一道面试题想到的论坛数据库设计

浏览 59785 次
精华帖 (7) :: 良好帖 (6) :: 新手帖 (10) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-04-09  
精彩的文章,精彩的评论,希望哪位大侠给个结论。。好让小弟们学习一下啊。哈哈
0 请登录后投票
   发表时间:2009-04-09  
jiangzhen1984 写道
wendong007 写道
这样的设计能用吗,你把数据查出来之后怎么确定那条数据是主题,哪些是回复呢,再遍历一次?还有就是你这样设计和分成两个表然后做单表查询的差别有多大,多一次查询也不会损失多大的性能吧,而且你这么设计的话,索引怎么建比较好呢,还有就是会不会造成这个表过热,还有……
我觉得如果真的负载很重,还是分表来的更实在些吧,另外,我同意猫咪的观点,像论坛这样的系统,使用缓存可以大大降低数据库的负载


再这么高插入更新的频率下 索引就有些不实用了,创建索引会降低插入更新的速度而且访问量这么大的情况下,索引不建议采用


大家真的认为,不用索引真的可以吗?
0 请登录后投票
   发表时间:2009-04-09  
jiangzhen1984 写道
wendong007 写道
tangmi 写道
不管这道题的真假
就这样的一个论坛,实时在更新、发帖、回帖。我觉得在数据库上建立索引不太好,但是如果不建立索引如何来提高查询等方面性能呢?

 

分表 分库 缓存

真正的解决方案我说不好,你可以去看看twitter的一篇文章

http://www.infoq.com/news/2008/06/twitter-and-sharding


认同分表,分库,缓存的做法。

 

问题分析: 每天论坛访问量300万左右,更新帖子10万左右。

  1. 读写比例在30:1左右, 应向读取效率方面倾斜. 索引建立需参考常用读取的主关键字.

  2. 每月数据在10W*30=300W. 可按月分表

  3. 每年帖子在300W*12=3600W, 推算数据不会小于30T. 可按年分库

 

结构:

  用户信息:独立表,userid主键

  发帖、回帖:按月表存储,帖子唯一ID主键,日期索引。

  帖子内容明细:按月存储,帖子唯一ID主键

 

1 请登录后投票
   发表时间:2009-04-09  
xellos 写道
jiangzhen1984 写道
wendong007 写道
这样的设计能用吗,你把数据查出来之后怎么确定那条数据是主题,哪些是回复呢,再遍历一次?还有就是你这样设计和分成两个表然后做单表查询的差别有多大,多一次查询也不会损失多大的性能吧,而且你这么设计的话,索引怎么建比较好呢,还有就是会不会造成这个表过热,还有……
我觉得如果真的负载很重,还是分表来的更实在些吧,另外,我同意猫咪的观点,像论坛这样的系统,使用缓存可以大大降低数据库的负载


再这么高插入更新的频率下 索引就有些不实用了,创建索引会降低插入更新的速度而且访问量这么大的情况下,索引不建议采用


大家真的认为,不用索引真的可以吗?


即使分表分库缓存,对于频繁更新(发帖,回帖,查询),创建索引会不会影响性能?
0 请登录后投票
   发表时间:2009-04-09  
期待经验丰富的大侠说说这方面
0 请登录后投票
   发表时间:2009-04-09  
共同期待,
个人感觉
如果 主题和 回复 放到一个表中,可以同用 主题id来当主键,然后 加一列,sort就是排序,谁排到第一个就是 主题了,以后就都是回复了
0 请登录后投票
   发表时间:2009-04-09  
jiangzhen1984 写道
wendong007 写道
这样的设计能用吗,你把数据查出来之后怎么确定那条数据是主题,哪些是回复呢,再遍历一次?还有就是你这样设计和分成两个表然后做单表查询的差别有多大,多一次查询也不会损失多大的性能吧,而且你这么设计的话,索引怎么建比较好呢,还有就是会不会造成这个表过热,还有……
我觉得如果真的负载很重,还是分表来的更实在些吧,另外,我同意猫咪的观点,像论坛这样的系统,使用缓存可以大大降低数据库的负载


再这么高插入更新的频率下 索引就有些不实用了,创建索引会降低插入更新的速度而且访问量这么大的情况下,索引不建议采用



不用索引等待流失用户吧~~

简单来说 你是觉得发表一篇帖子慢可以接受 还是看一篇帖子慢可以接受?

拿一张500万的表来说事

更新的时候如果没有索引的话  更新时间大概需要30秒左右 指的是全表更新~~

而查询某单行记录 却需要10秒左右~~

而加入索引的话 更新时间差不多慢了一倍有余
而查询记录则缩减到毫秒级~~
快了百倍有余~~
孰重孰轻 自己选
1 请登录后投票
   发表时间:2009-04-09  
一个网站开打 9秒会比打开10秒的 要多10%的用户
2 请登录后投票
   发表时间:2009-04-09  
自己的一点经验:
1.分表存储;
2.建立索引;SQL按所以查询的速度还是很快的;
3.避免整表扫描;先读取主题,在按照主题ID读取回复;再按照用户ID读取用户;而不要使用关联;
4.使用缓存;
请大家多指教
1 请登录后投票
   发表时间:2009-04-09  
需要分3张表,且建立索引。。。
理由如下:
建立3张表可以避免冗余数据,维护起来方便。。。
每天论坛访问量300万左右
可见主要的压力来自于查询,sql查询的效率在于避免全表扫描,可见建立索引是必须的。。。
关于创建索引会降低插入更新的速度这个问题是不存在的。。。
因为,索引之所以会降低更新的速度的速度,是因为在更新完对应字段后还需要更新对应字段的索引。我们回到题目中,看到更新帖子10万左右。
这句话是说,我们可能对发帖标题,发帖内容,回复标题,回复内容这4个字段做更新。。。需要注意的是,这四个字段并不是用来建立表连接的字段,为了优化查询速度我们不会在这四个字段上建立索引,所以从这道题目出发,我们建立的索引不会影响更新帖子的性能。。。
所以,我认为最后的答案是建立3张表,在连接用到的字段上建立索引。。。
5 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics