数据库中的分表技术

数据量很大的时候,通常情况下,为了便于查询,便于管理 我们可以用分表技术、分区技术等。

1、水平分表

物理方式分表设计

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

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

111.png

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  身高  体重  性别  家庭地址  身份证号


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


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


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

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



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与