数据库中的分表技术

1、水平分表

物理方式分表设计

自己手动创建多个数据表出来

开发者需要考虑分表算法:数据往哪个表写,从哪个表读

QQ的登录表。假设QQ的用户有10亿,如果只有一张表,每个用户登录的时候数据库都要从这10亿中查找,会很慢很慢。如果将这一张表分成100份,每张表有1000万条,就小了很多,比如qq0,qq1,qq2......qq99表。

用户登录的时候,可以将用户的id%100,那么会得到0-99的数,查询表的时候,将表名qq跟取模的数连接起来,就构建了表名。比如123456789用户,取模后是89,那么就到qq89这个表中去查询,查询的时间将会大大缩短。

分表后的问题一:假如说,注册时,如何知道该用户存储到那张表中?

答:可以借助一下redis或者新创建一张临时表(临时表只有一个user_id字段,具体看场景)等方式,假如这里我们用redis

$user_id = $redis->incr('user_id');

//假如我们要分四张表来存储

$user_id%4 = 获取余数

假如$user_id = 8 余数是0,那我们就存储到user_0这个表里面了。

user_0表里面的字段至少要有 本身自增id  $user_id这两个字段,然后其它的一些字段

分表后的问题二:登录时,如果通过昵称来登录该怎么办?

$username = '小白'; //如何知道该昵称在那张表里面呢?

答:同样可以借助redis来存储user_id和username的对应关系,或者在数据库中创建一张表,只存储user_id和username的对应关系,这样通过username就可以找到对应的user_id,然后就可以找到表了

PS:没有什么是一个字段解决不了的问题,如果有那就在加个字段,如果还有那就加一张表吧

2、垂直分表(比较常用)

有的时候,一个数据表设计好了,里边有许多字段,但是这些字段有的是经常使用的,有的是不常用的。在进行正常数据表操作的时候,不常用的字段也会占据一定的资源,对整体操作的性能造成一定的干扰、影响。

为了减少资源的开销、提升运行效率,就可以把不常用的字段给创建一个专门的辅表中去。

同一个业务表的不同字段分别存储到不同的数据表的过程就是“垂直分表”。

例如:

会员数据表有如下字段:

会员表: user_id  登录名  密码  邮箱  手机号码 身高  体重  性别  家庭地址  身份证号

为了使常用字段运行速度更快、效率更高,把常用字段给调出来,因此数据表做以下垂直分表设计:

会员表(主)user字段:user_id  登录名  密码  邮箱  手机号码

会员表(辅)user_fu字段:user_id  身高  体重  性别  家庭地址  身份证号

红色字体是热数据(经常查询的、活跃的数据)、蓝色字体是冷数据(不经常查询的)

以上把会员表根据字段是否常用给分为两个表的过程就是垂直分表。

水平分表:是把一张表的全部数据分别存储到不同的分表之中(每张表的字段是一模一样的)

垂直分表:是把一张表的全部字段分别存储到不同的表里边

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容