一、为什么什么要分区分表
1.海量数据的产生,需要数据查询和分析,系统响应会变慢,TPS下降,直至服务不可用
2.单个表数据量越大,读写锁,插入操作重新建立索引效率越低,为了支撑高并发、数据量大的问题。
二、分区
定义:就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的
什么时候可以考虑分区?
- 一张表的查询速度已经慢到影响使用
- sql经过优化
- 数据量大
- 表中的数据是分段的
- 对数据的操作往往只涉及一部分数据,而不是所有的数据
分区分表的类型
- 水平分区:这种形式分区是对表的行进行分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区)或集体分割(1个或多个分区)。所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。
- 举个例子:师傅收徒记录的表可以被分区为每天的记录分区,每个分区包含的是某一天的记录。(分区一定要通过某个属性列来分割,譬如这里使用的列就是天)
- 垂直分区:这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对应的行。
- 举个例子:发票记录的表包含了一个超大的text和BLOB列,而这些列却又不是经常访问。这时候就要把这些不经常使用的text和BLOB了划分到另一个分区,在保证它们数据相关性的同时还能提高访问速度
常见分区分表的规则策 (mysql 5.1 )
序号 | 分区类型 | 说明 | 使用频率 |
---|---|---|---|
1 | RANGE分区 | 基于属于一个给定连续区间的列值,把多行分配给分区 | 较多 |
2 | LIST分区 | 类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择 | 一般 |
3 | HASH分区 | 基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式 | 较多 |
4 | KEY分区 | 类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。 | 一般 |
分区分表策略要考虑的问题
- join时跨库,跨表的问题
- 跨节点的count,order by,group by以及聚合函数问题
- 按时间分区,查询主键数据跨表的问题,以及业务逻辑跨表时刻的处理
- 数据迁移,容量规划,扩容等问题
- 对于已经过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据
三、分库
- 简述:如何进行分库分表,目前互联网上有许多的版本,比较知名的一些方案:阿里的TDDL,DRDS和cobar,京东金融的sharding-jdbc;民间组织的MyCAT;360的Atlas;美团的zebra。其他比如网易,58,京东等公司都有自研的中间件。但是这么多的分库分表中间件方案,归总起来,就两类:client模式和proxy模式。
- 无论是client模式,还是proxy模式,几个核心的步骤是一样的:SQL解析,重写,路由,执行,结果归并。
- client 架构简单,性能损耗也比较小,运维成本低。
网友评论