@
gfreezy 如果用上覆盖索引(index1(last_reply_time,topicid),index2(post_time,topicid),index3(tagid,topicid))之后再通过get_multi获得列表详细确实比走覆盖索引再join一下topic 表或者再回表获得详细信息效率高很多,mysql数据量大之后join的效果不是那么理想。多谢指导,获益匪浅。
这是建立在从cache拿数据比直接从数据库拿数据效率高,没有测试,实际上也不一定,别的不说,直接从数据库join拿,只需要一次网络IO,而从数据库拿到再去cache获得详细得两次网络IO。当然当数据量很大并且越来越大,随着join性能越来越低的时候走cache的效率会越高,水平切分的分布式系统就更不用说了。
还有一点我想说的是,即使是
stackoverflow.com 这种全球排名百名内的站点,这么多年来也就400万topic的数据,大网站并没有想象的那么多。百万量级甚至千万量级的数据规模下,LZ这种设计可以说一点问题都没有,特别是在内存廉价和SSD出现后,facebook数据库服务器标配内存不都128G还是256G了么。
从楼上的各个回答来看,使用或者赞同这种设计的人不在少数。退一万步讲,冗余下tags对于生成cache也是有好处的,而业务复杂度和空间上损失的代价也不是那么高,当然如果cache用的好看起来必要性似乎也没那么高,但肯定称不上幼稚的设计。