【面试题 - mysql】进阶篇 - 分库分表
这里写目录标题
- 1. 拆分策略
- 1.1 垂直拆分
- 1.1.1 垂直分库(以表为依据,根据业务将不同表拆分到不同库中)
- 1.1.2 垂直分表(以字段为依据,根据字段属性将不同字段拆分到不同表中)
- 1.2 水平拆分
- 1.1.1 水平分库(以字段为依据,按照一定策略,将一个库的数据拆分到多个库中)
- 1.1.2 垂直分表(以字段为依据,按照一定策略,将一个表的数据拆分到多个表中)
- 2. MyCat
- 2.1 概念介绍
- 2.2 MyCat分片
- 2.2.1 垂直拆分
- 2.2.2 水平拆分 - 分片规则
- 2.2.2.1 范围分片
- 2.2.2.2 取模分片
- 2.2.2.3 一致性hash分片
- 2.2.2.4 枚举分片
- 2.2.2.5 应用指定算法
- 2.2.2.6 固定分片hash算法
- 2.2.2.7 字符串hash解析算法
- 2.2.2.8 按天分片算法
- 2.2.2.9 自然月分片
- 3. mycat 原理
- 3.1 插入
- 3.2 查询
1. 拆分策略
分库分表的形式,主要是两种:垂直拆分和水平拆分。而拆分的粒度,一般又分为分库和分表,所以组成的拆分策略最终如下:
1.1 垂直拆分
1.1.1 垂直分库(以表为依据,根据业务将不同表拆分到不同库中)
每个库的表结构都不一样。
每个库的数据也不一样。
所有库的并集是全量数据。
1.1.2 垂直分表(以字段为依据,根据字段属性将不同字段拆分到不同表中)
每个表的结构都不一样。
每个表的数据也不一样,一般通过一列(主键/外键)关联。
所有表的并集是全量数据。
1.2 水平拆分
1.1.1 水平分库(以字段为依据,按照一定策略,将一个库的数据拆分到多个库中)
每个库的表结构都一样。
每个库的数据都不一样。
所有库的并集是全量数据。
1.1.2 垂直分表(以字段为依据,按照一定策略,将一个表的数据拆分到多个表中)
每个表的表结构都一样。
每个表的数据都不一样。
所有表的并集是全量数据。
2. MyCat
2.1 概念介绍
在MyCat的逻辑结构主要负责逻辑库、逻辑表、分片规则、分片节点等逻辑结构的处理,而具体的数据存储还是在物理结构,也就是数据库服务器中存储的。
2.2 MyCat分片
2.2.1 垂直拆分
在业务系统中, 涉及以下表结构 ,但是由于用户与订单每天都会产生大量的数据, 单台服务器的数据存储及处理能力是有限的, 可以对数据库表进行拆分, 原有的数据库表如下。
垂直拆分后:
以上拆分方式,如果订单关联区域表查询会报错;
对于省、市、区/县表tb_areas_provinces , tb_areas_city , tb_areas_region,是属于数据字典表,在多个业务模块中都可能会遇到,可以将其设置为全局表,利于业务操作。最终拆分方式如图:
2.2.2 水平拆分 - 分片规则
2.2.2.1 范围分片
根据指定的字段及其配置的范围与数据节点的对应情况, 来决定该数据属于哪一个分片。
2.2.2.2 取模分片
根据指定的字段值与节点数量进行求模运算,根据运算结果, 来决定该数据属于哪一个分片。
2.2.2.3 一致性hash分片
所谓一致性哈希,相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加而改变原来数据的分区位置,有效的解决了分布式数据的拓容问题。
2.2.2.4 枚举分片
通过在配置文件中配置可能的枚举值, 指定数据分布到不同数据节点上, 本规则适用于按照省份、性别、状态拆分数据等业务 。
2.2.2.5 应用指定算法
运行阶段由应用自主决定路由到那个分片 , 直接根据字符子串(必须是数字)计算分片号。
2.2.2.6 固定分片hash算法
该算法类似于十进制的求模运算,但是为二进制的操作,例如,取 id 的二进制低 10 位 与1111111111 进行位 & 运算,位与运算最小值为 0000000000,最大值为1111111111,转换为十进制,也就是位于0-1023之间。
特点:
如果是求模,连续的值,分别分配到各个不同的分片;但是此算法会将连续的值可能分配到相同的分片,降低事务处理的难度。
可以均匀分配,也可以非均匀分配。
分片字段必须为数字类型。
2.2.2.7 字符串hash解析算法
截取字符串中的指定位置的子字符串, 进行hash算法, 算出分片。
2.2.2.8 按天分片算法
2.2.2.9 自然月分片
3. mycat 原理
3.1 插入
3.2 查询
视频来源:https://www.bilibili.com/video/BV1Kr4y1i7ru?p=188&spm_id_from=pageDriver&vd_source=b901ef0e9ed712b24882863596eab0ca