概念: 当数据库的内容, 经过长时间的积累, 数据量会越来越大, 会严重影响到数据库的执行效率, 降低查询效率, 这个时候为了提高效率, 我们可以采用分库分表的方式来进行, 对数据库的优化
分表
- 水平分表
- 垂直分表
水平分表(针对表的行数过多, 进行拆分)
- 使用水平分表的例子, 就比如说是一个小学新来了一个校长, 校长要求把学生历年来的成绩, 包括周考和月考全都保存下来, 这样的话一年下来就会存在很多的学生成绩记录, 要想高效的解决这个问题, 我们就可以使用水平分表的操作来提高数据库的执行效率
不要着急容我慢慢分析
- 例如要求一年级一班的学生成绩, 一直保存到他们六年级毕业, 但是期间他们会参加很多次的考试, 如果在一张表存肯定是没有问题的, 但是就有个缺点了, 比如一个班级学生60人, 一次考试就是60条数据, 一年下来就会有很多很多数据, 然后大量的数据都存到同一个表里边, 进行条件查询和筛选都会降低查询效率, 这个时候我们就可以使用水平拆分
- 我们可以按照一个保准来创建表, 比如我们可以判断当前月, 例当前月是9月, 我们就可以创建一个表为 Sutdent_21_09 的表, 把这个月的学生成绩,就存到这个表里边, 这样的话就可以解决一个表里存了很多数据, 降低查询效率的问题
- 如果这么做, 每周考试一次, 每个月一次月考, 一个月算下来有五次考试, 60个学生就是每月300条数据一张表, 这样可以有效提高查询效率
ps : 上文举的例子, 数据量不大, 也可没必要分表粒度按月, 或者按年, 上文只是为了方便理解举例而已
垂直分库(针对表的列数过多, 进行拆分)
- 使用垂直分表的例子, 就比如这个校长通过长时间的数据分析发现, 家长和老师都更关注孩子的主要科目成绩, (数学, 语文, 英语) 这个时候, 一张表中存放了好多科目, 存在过多的列, 为了提高家长和老师的查询效率, 我们就可以采用垂直分库的方式, 提高查询的效率
容我举例分析
- 比如我们每次更多的是查询,语数英三科的成绩, 这个时候, 我们就可以根据垂直拆分的方式, 把经常查的这三们成绩存到一张表里, 把其他科目的成绩存放到另一个表中, 通过大表拆小表的方式, 提高了查询的效率
ps : 上文例子, 列的数量不是很多, 基本上没必要强制使用垂直分表的方式, 只是举例, 方便理解而已
总结 : 水平和垂直分表的优缺点
优点
- 水平分表
- 表的管理在数据库端就可以完成
- 不会存在超大量的数据,和高负载的情况
- 事务问题的处理相对简单
- 如果拆分规则定义好, 那么他的扩展性也是很好的
- 垂直分表
- 拆分更加简单明了, 拆分的规则明确
- 数据维护方便, 容易定位
缺点
- 水平分表
- 拆分的规则不明确, 很难抽象出一个能够满足的拆分规则
- 数据维护有难度, 手工定位数据比较不方便
- 耦合度太高, 会对后期数据迁移造成一定的困难
- 垂直分表
- 存在单表数据量过大的问题 ( 需要水平分表 )
- 分布式事务处理复杂
- 对访问频繁并且数据量大的表依然存在性能问题
分库(待完善)