http://www.javaeye.com/topic/364016?page=5
ak478288:
简单用户表 tb_user:
userid , username
用户详细信息表 tb_userinfo
userid , email , homepage , phone , address
把用户信息分开的目的就是保证经常查询的数据在一张表,其它信息放到另一张表
论坛主题表 tb_bbs
bbsid , userid , title , ip , repleycount , replyuserid , createtime , lastreplytime
论坛内容标 tb_bbs_content (此表可按照bbsid进行分表存储)
bbsid , content;
论坛回复表 tb_bbs_reply (此表可按照bbsid进行分表存储)
replyid , bbsid , userid , content , replytime , ip
说说我设计的想法 :
论坛使用最多的功能为以下几个
一个话题列表页面,例如
select count(*) from tb_bbs; 查询数量,用来分页
select * from tb_bbs order by lastreplytime desc limit ?,?;
在列表中一般会显示发帖人的基本信息,例如username
在这里一般会使用以下的查询方式:
select * from tb_user u , tb_bbs b where u.userid=b.userid order by lastreplytime desc limit ?,?;
如果连表操作压力大的情况下,可以直接使用
select * from tb_bbs order by lastreplytime desc limit ?,?;
对于用户信心可以根据userid去缓存中取数据,这样避免的与tb_bbs表的关联查询
一个话题单页
对内容分表,可看具体情况而定,例如
bbsid是数字
bbs_content根据bbsid末位进行分表
分为
bbs_content0 ,
bbs_content1 ,
bbs_content2 ,
bbs_content3 ,
bbs_content4 ,
bbs_content5 ,
bbs_content6 ,
bbs_content7 ,
bbs_content8 ,
bbs_content9
tb_bbs_reply可以分为
tb_bbs_reply0 ,
tb_bbs_reply1 ,
tb_bbs_reply2 ,
tb_bbs_reply3 ,
tb_bbs_reply4 ,
tb_bbs_reply5 ,
tb_bbs_reply6 ,
tb_bbs_reply7 ,
tb_bbs_reply8 ,
tb_bbs_reply9 ,
例如bbsid=5687
select * from tb_bbs where bbsid=5687
//去缓存中取bbs_content相应内容,如果没有就根据算法
int tableIdx=modTable(5687);
//tableIdx=7
select * from tb_bbs_content7 where bbsid=5687;
select * from tb_bbs_reply7 where bbsid=5687 order by replyid asc limit ?,?
用户信息从缓存中取或者
select * from tb_bbs_reply7 r tb_user u,where bbsid=5687 adn r.userid=u.userid order by replyid asc limit ?,?
基本的使用场景是这个样子.
里面所有对于分表的思想就是,尽量让表文件大小达到最小化,
把内容与其它信息分开的好处就是可以让每个表的文件最小化,对数据库操作压力会减小.
这样保证每张表数据量很小,操作速度会快,而且可以搭配缓存,把内容根据情况进行缓存,可以尽量很少访问表数据
对于高访问量,不能只依赖于数据库,还要配合缓存的使用,我在上述例子中使用的缓存只是做法一种,也许还有更好的
对于上述分表方式也可以适用于分库操作,这样就降低了数据库单库的压力,把压力分散到各个机器
我的做法就是尽量避免表关联
再就是对于sql语句尽量都保证索引有效,不能索引的sql,尽量采用能索引的高效方式解决
有不妥的地方请指正
////////
z494627:
提高速度的关键:
1.建立索引并在查询时充分利用;
2.避免使用关联,这样避免整表扫描;使用关联不如多次使用主键查询来的快;
3.一些处理的功能尽可能放到内存中来做,比如组织主题和回复;
4.使用静态页面也是个不错的做法;
///////