请教一下问下分表的问题
我看到一些应用,他建立一个类似于索引表的,比如
table_id
表结构很简单:CREATE TABLE
jishigou_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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
专门用来记录uid和tableid对应关系表也叫路由表,为何需要这么一张路由表,而不是采用取余(包括hash之后取余)主要出于扩展性考虑的:
当表数据量增长至超过系统设计之初的预估量时,查询速度会越来越慢,需要对数据进行重新分表,直接取余方式这时有个明显的缺陷:部分数据重新划分至新表时,需要修改取余算法,悲催地是有可能取余算法是硬编码在程序中(很有可能是在多个甚至几十个程序中),结果导致必须停机(意味着业务的暂停),修改多个程序的取余算法,建立新表并完成数据的迁移,发布修改之后的程序,开机恢复业务;
而如果有张路由表整个过程就很简单:建立新表,逐条数据迁移至新表,每条数据迁移至新表后修改路由表记录引导程序到新表读取,迁移完成之后只需删除旧表的冗余数据即可。这就是路由表的存在意义。至于疑问二,多一张路由表,查询速度当然是会比直接取余算法慢,但是因为路由表单条记录占用空间少,且每次都是基于主键的查询,每次查询时间应当<1ms,在可接受范围内。
假设 buddy_fans 有包含以下字段:
uid
,username
,gander
,nickname
其中,
uid
可能根据 router 表确定在数据所在表那
username
呢?根据 username 查询用户的场景下,该如何设计呢?