其他分享
首页 > 其他分享> > 分库分表问题

分库分表问题

作者:互联网

数据库可以通过主从复制将数据复制多份实现读写分离,读走从库,写走主库,应对量并发读的能力,同时提⾼数据安全性。

但是对于单个表,还存在很多问题,比如:

因此可以做分库分表,将问题隔离在某一张表或者某一个库中,降低单个库的压力。基本思想是依照某⼀种策略将数据尽量平均地分配到多个数据库节点或者多个表中。分库分表后,不同的节点值保存部分数据,所有库表加到一块就是所有的数据。拆分分为垂直拆分和水平拆分。

一、垂直拆分

原则⼀般是专库专用,注重业务相关性,将数据库的表分离到不同的库中,比如用户关系放在用户库,内容放在内容库。
但是水平拆分无法解决单张表记录量增长的问题,⽐如视频或者直播业务中,用户会在视频播放过程中发送大量的弹幕,会有数据膨胀的问题。因此需要做单张表拆分。

二、水平拆分

水平拆分更注重数据的特点,将单表内具有一定相关性的记录拆分到不同的表或者库中。但是要考虑拆分规则,也就是如何根据单条记录定位到库。
可选方案有:

三、分库分表引入的问题

主要是水平分库

1、区分键的问题

分区键问题:具体的表现是,如果把记录存放在哪个库是依据主键ID进行hash取余计算得来的,也就是分表的时候是根据主键定位到具体的库。那么后续如果根据非主键,比如根据用户名去查找记录,现在只根据用户名去定位记录,就要先找到主键ID,否则就要把所有库扫描一遍。

解决办法之⼀就是:建立⼀个额外的映射表。这个表只有两个字段用户名和主键ID,查询记录时候先根据用户名去找ID,然后再根据ID去定位到库表,虽然这个映射表会有⼀定的存储消耗,但是毕竟只有两个字段,相对来说可以接受。

2、数据库特性难以实现

聚合操作:在未分库分表之前查询记录总数时只需要在SQL中执⾏count()聚合函数即可,现在数据被分散到多个库表中,我们可能要考虑其他的⽅案,比方说将计数的数据单独在⼀张表中或者记录在Redis⾥⾯单独记录。

3、全局ID问题

水平分表之后引入的另外一个比较严重的问题就是如何选择全局唯一ID作为主键。

四、如何选择全局ID

1、业务字段作为主键

选择业务字段作为主键,⽐如⾝份证,邮箱或者⼿机号等,但是并不通⽤

2、UUID作为全局

主键要保证全局唯⼀性,保证每个机器上生成的记录都不会冲突,UUID类似的随机生成可以保证唯一,但是无法保证一定递增。
为什么要保证递增?

3、雪花算法计算全局ID

Snowflake的核心思想是将64bit的⼆进制数字分成若干部分,每⼀部分都存储有特定含义的数据,比如说时间戳、机器ID、序列号等等,最终⽣成全局唯⼀的有序ID。
比如当前机器上,第2台机器,时间戳第32毫秒,有12个序列号位,当前时间戳下可以生成2^12个序号ID,基本可以满足要求。
雪花算法缺点:

标签:分库,记录,主键,问题,拆分,分表,ID
来源: https://www.cnblogs.com/welan/p/16651734.html