锁定老帖子 主题:从一道面试题想到的论坛数据库设计
精华帖 (7) :: 良好帖 (6) :: 新手帖 (10) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-09
精彩的文章,精彩的评论,希望哪位大侠给个结论。。好让小弟们学习一下啊。哈哈
|
|
返回顶楼 | |
发表时间:2009-04-09
jiangzhen1984 写道 wendong007 写道 这样的设计能用吗,你把数据查出来之后怎么确定那条数据是主题,哪些是回复呢,再遍历一次?还有就是你这样设计和分成两个表然后做单表查询的差别有多大,多一次查询也不会损失多大的性能吧,而且你这么设计的话,索引怎么建比较好呢,还有就是会不会造成这个表过热,还有……
我觉得如果真的负载很重,还是分表来的更实在些吧,另外,我同意猫咪的观点,像论坛这样的系统,使用缓存可以大大降低数据库的负载 再这么高插入更新的频率下 索引就有些不实用了,创建索引会降低插入更新的速度而且访问量这么大的情况下,索引不建议采用 大家真的认为,不用索引真的可以吗? |
|
返回顶楼 | |
发表时间:2009-04-09
jiangzhen1984 写道
wendong007 写道
tangmi 写道
不管这道题的真假
就这样的一个论坛,实时在更新、发帖、回帖。我觉得在数据库上建立索引不太好,但是如果不建立索引如何来提高查询等方面性能呢?
分表 分库 缓存 真正的解决方案我说不好,你可以去看看twitter的一篇文章
问题分析: 每天论坛访问量300万左右,更新帖子10万左右。 1. 读写比例在30:1左右, 应向读取效率方面倾斜. 索引建立需参考常用读取的主关键字. 2. 每月数据在10W*30=300W. 可按月分表 3. 每年帖子在300W*12=3600W, 推算数据不会小于30T. 可按年分库
结构: 用户信息:独立表,userid主键 发帖、回帖:按月表存储,帖子唯一ID主键,日期索引。 帖子内容明细:按月存储,帖子唯一ID主键
|
|
返回顶楼 | |
发表时间:2009-04-09
xellos 写道 jiangzhen1984 写道 wendong007 写道 这样的设计能用吗,你把数据查出来之后怎么确定那条数据是主题,哪些是回复呢,再遍历一次?还有就是你这样设计和分成两个表然后做单表查询的差别有多大,多一次查询也不会损失多大的性能吧,而且你这么设计的话,索引怎么建比较好呢,还有就是会不会造成这个表过热,还有……
我觉得如果真的负载很重,还是分表来的更实在些吧,另外,我同意猫咪的观点,像论坛这样的系统,使用缓存可以大大降低数据库的负载 再这么高插入更新的频率下 索引就有些不实用了,创建索引会降低插入更新的速度而且访问量这么大的情况下,索引不建议采用 大家真的认为,不用索引真的可以吗? 即使分表分库缓存,对于频繁更新(发帖,回帖,查询),创建索引会不会影响性能? |
|
返回顶楼 | |
发表时间:2009-04-09
期待经验丰富的大侠说说这方面
|
|
返回顶楼 | |
发表时间:2009-04-09
共同期待,
个人感觉 如果 主题和 回复 放到一个表中,可以同用 主题id来当主键,然后 加一列,sort就是排序,谁排到第一个就是 主题了,以后就都是回复了 |
|
返回顶楼 | |
发表时间:2009-04-09
jiangzhen1984 写道 wendong007 写道 这样的设计能用吗,你把数据查出来之后怎么确定那条数据是主题,哪些是回复呢,再遍历一次?还有就是你这样设计和分成两个表然后做单表查询的差别有多大,多一次查询也不会损失多大的性能吧,而且你这么设计的话,索引怎么建比较好呢,还有就是会不会造成这个表过热,还有……
我觉得如果真的负载很重,还是分表来的更实在些吧,另外,我同意猫咪的观点,像论坛这样的系统,使用缓存可以大大降低数据库的负载 再这么高插入更新的频率下 索引就有些不实用了,创建索引会降低插入更新的速度而且访问量这么大的情况下,索引不建议采用 不用索引等待流失用户吧~~ 简单来说 你是觉得发表一篇帖子慢可以接受 还是看一篇帖子慢可以接受? 拿一张500万的表来说事 更新的时候如果没有索引的话 更新时间大概需要30秒左右 指的是全表更新~~ 而查询某单行记录 却需要10秒左右~~ 而加入索引的话 更新时间差不多慢了一倍有余 而查询记录则缩减到毫秒级~~ 快了百倍有余~~ 孰重孰轻 自己选 |
|
返回顶楼 | |
发表时间:2009-04-09
一个网站开打 9秒会比打开10秒的 要多10%的用户
|
|
返回顶楼 | |
发表时间:2009-04-09
自己的一点经验:
1.分表存储; 2.建立索引;SQL按所以查询的速度还是很快的; 3.避免整表扫描;先读取主题,在按照主题ID读取回复;再按照用户ID读取用户;而不要使用关联; 4.使用缓存; 请大家多指教 |
|
返回顶楼 | |
发表时间:2009-04-09
需要分3张表,且建立索引。。。
理由如下: 建立3张表可以避免冗余数据,维护起来方便。。。 每天论坛访问量300万左右 可见主要的压力来自于查询,sql查询的效率在于避免全表扫描,可见建立索引是必须的。。。 关于创建索引会降低插入更新的速度这个问题是不存在的。。。 因为,索引之所以会降低更新的速度的速度,是因为在更新完对应字段后还需要更新对应字段的索引。我们回到题目中,看到更新帖子10万左右。 这句话是说,我们可能对发帖标题,发帖内容,回复标题,回复内容这4个字段做更新。。。需要注意的是,这四个字段并不是用来建立表连接的字段,为了优化查询速度我们不会在这四个字段上建立索引,所以从这道题目出发,我们建立的索引不会影响更新帖子的性能。。。 所以,我认为最后的答案是建立3张表,在连接用到的字段上建立索引。。。 |
|
返回顶楼 | |