首页 > 分表之后,按照时间排序获得数据有没有好的方式

分表之后,按照时间排序获得数据有没有好的方式

有三张表:

用户表:user-------------------user_id


文章表:article----------------article_id,user_id;


评论表:article_comment----comment_id,article_id


user表对article_comment表是一对多对多的关系。

现在对article_comment进行分表,按照article_id%6分为article_comment_0/1/2/3/4/5六张表,
现在需要根据评论的时间来展示某一个用户的所有文章的评论,sql该怎么写呢?


应该按照你查询条件进行分表,不然没有好办法


一般用elasticsearch来实现


经过2天的讨论,我们决定分表结构不变,article_comment(评论)表按照article_id取余进行分表,后台评论管理的时候,按照时间进行分页,(最近一天,最近两天,最近五天。。。参考微信公众平台的评论管理),将时间作为限制条件查询所有评论表:


sql:SELECT * FROM article_comment_0/1/2.. where create_time > time()-24*3600


之后代码进行排序,显示到前端页面。
如果想管理所有评论只能依据某一篇文章进行管理。
以上。


SELECT * FROM((SELECT * FROM article_comment_0 INNER JOIN article ON article_comment_0.article_id=article.article_id WHERE article.user_id='userid') UNION
(SELECT * FROM article_comment_1 INNER JOIN article ON article_comment_1.article_id=article.article_id WHERE article.user_id='userid') UNION
(SELECT * FROM article_comment_2 INNER JOIN article ON article_comment_2.article_id=article.article_id WHERE article.user_id='userid') UNION
(SELECT * FROM article_comment_3 INNER JOIN article ON article_comment_3.article_id=article.article_id WHERE article.user_id='userid') UNION
(SELECT * FROM article_comment_4 INNER JOIN article ON article_comment_4.article_id=article.article_id WHERE article.user_id='userid') UNION
(SELECT * FROM article_comment_5 INNER JOIN article ON article_comment_5.article_id=article.article_id WHERE article.user_id='userid')) res
ORDER BY res.comment_createtime DESC

你的表这样子设计就要每次都去联结article查询,所以建议在common表中冗余一个user_id字段,这样查询就不用多一步操作


能不分表就不分表,分表会给开发带来很大麻烦,你可以用分区,mysql不太懂,但是我搜到这个:

http://dev.mysql.com/doc/refm...


你这样的分表根据你的业务避免不了的,UNION肯定要使用
优化一:你在article_comment表最好冗余uid字段,减少表连接查询
优化二:再建个评论索引表,就存uid,articleId,评论时间,评论id四个字段,后面可以根据具体业务再新增字段,但不要太多了,这是张全局的用户评论关系表,是张单表,加好索引这张表放几千万不成问题
在优化二中你可以通过时间查询用户的articleId,评论id字段再去相应的分表中查询,直接用in (评论id),效率要比你的写法高

【热门文章】
【热门文章】