请教一下问下分表的问题

发布于 2022-08-29 21:32:44 字数 660 浏览 22 评论 0

我看到一些应用,他建立一个类似于索引表的,比如

table_id
表结构很简单:
CREATE TABLEjishigou_buddy_fans_table_id(uidmediumint(8) unsigned NOT NULL,table_idsmallint(4) unsigned NOT NULL, PRIMARY KEY (uid) ) ENGINE=MyISAM DEFAULT CHARSET=gbk

这个表里面,记录了一条数据放在哪个表。其他分表就放具体的数据了
buddy_fans_1
buddy_fans_2
buddy_fans_3
buddy_fans_4
……

查询时,先从主表查数据在哪个表,再从具体的表里面查到详细信息。

疑问1:为啥需要一个表来存放一条数据放在哪个表,简单的取余数也能迅速定位放在哪个表呀。这样不是多此一举?
疑问2:这样分表查询速度会提高吗?假如有一千万数据,主表怎么也得保存一千万条数据,从一千万数据里面捞一条记录,再去分表里面的百万条记录捞一条,速度真提高了吗?

实在不解,类似的应用就是discuz的附件表,也是这样的 设计。

求大牛指点一下,谢谢。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

彻夜缠绵 2022-09-05 21:32:44

专门用来记录uid和tableid对应关系表也叫路由表,为何需要这么一张路由表,而不是采用取余(包括hash之后取余)主要出于扩展性考虑的:
当表数据量增长至超过系统设计之初的预估量时,查询速度会越来越慢,需要对数据进行重新分表,直接取余方式这时有个明显的缺陷:部分数据重新划分至新表时,需要修改取余算法,悲催地是有可能取余算法是硬编码在程序中(很有可能是在多个甚至几十个程序中),结果导致必须停机(意味着业务的暂停),修改多个程序的取余算法,建立新表并完成数据的迁移,发布修改之后的程序,开机恢复业务;
而如果有张路由表整个过程就很简单:建立新表,逐条数据迁移至新表,每条数据迁移至新表后修改路由表记录引导程序到新表读取,迁移完成之后只需删除旧表的冗余数据即可。这就是路由表的存在意义。至于疑问二,多一张路由表,查询速度当然是会比直接取余算法慢,但是因为路由表单条记录占用空间少,且每次都是基于主键的查询,每次查询时间应当<1ms,在可接受范围内。

如歌彻婉言 2022-09-05 21:32:44

假设 buddy_fans 有包含以下字段:
uid, username, gander, nickname

其中,uid 可能根据 router 表确定在数据所在表
username 呢?

根据 username 查询用户的场景下,该如何设计呢?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文