文章目录
一、数据库分区、分表、分库、分片
YesOk ,大家好 ,我是小刘,许久不见,甚是想念 ,小刘今天来带大家学习 分库分表地基础知识
![87b316643e2ffa42d2a841f94f36f9ac.png](https://i-blog.csdnimg.cn/blog_migrate/d617d0596cbb21028048e1054983e723.jpeg)
1.1 单机数据库的瓶颈
![b220690256278da4add9c333f1e9cced.png](https://i-blog.csdnimg.cn/blog_migrate/97e2822f6cfa32a7bf734853c20dbeb0.jpeg)
- 单个表数据量越大,读写锁,插入操作重新建立索引效率越低。
- 单个库数据量太大(一个库数据量到1T - 2T就是极限)
- 单个数据库服务器压力过大
- 读写速度遇到瓶颈(并发量几百)
1.2 分区
数据库分区是一种物理数据库的设计技术,它的目的是为了在特定的 SQL操作中减少数据读写的总量以缩减响应是间。
分区并不是生成新的数据库表,而是将表的数据均匀分摊到不同的硬盘,系统或不同服务器存储介子中,实际上还是一张表。另外,分区可以做到将表的数据分摊到不同的地方,提高数据检索的效率,降低数据库频繁 IO压力值,分区的优点如下:
- 相对于单个文件系统或硬盘,分区可以存储更多的数据。
- 数据管理比较方便,如要清理或废弃某年的数据,就可以直接删除该日期的分区数据即可。
- 精准定位分区查询数据,不需要全表扫描查询,大大提高检索效率。
- 可跨多个分区磁盘查询,来提高查询的吞吐量。
- 在涉及聚合函数时,很容易进行数据的合并。
1.2.1 什么时候考虑使用分区?
- 一张表的查询速度已经慢到影响使用的时候。
- sql经过优化
- 数据量大
- 表中的数据是分段的
- 对数据的操作往往只涉及一部分数据,而不是所有的数据
1.2.2 水平分区
这种形式分区是对表的行进行分区,通过这种的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分体或集体分割。所有在表中定义的列在每个数据集中都能找到,所以表的特性得以保持。
举例:一个包含十年发票记录的表可以被分区为10个不同的分区,每个分区包含的是其中一年的记录。
1.2.3 垂直分区
这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对应的行。
举例:一个包含了大 text和 blob列的表,这些 text和 blod列又不经常被访问,这时候就要把这些不经常使用的 text和 blob了划分到另一个分区,在保证它们数据关联性的同时还能提高访问速度。
1.2.4 分区实现的方式
mysql5开始支持分区功能
创建表:
create table sales(id int auto increment,amount double not null,order_day datetime not null,primary key(id,order_day)) engine=Innodb
设置分区:
partition by range(year(order_day))(partition p_2010 values less than (2000),partition p_2011 values less than (2011),partition p_2012 values less than (2012),partition p_2012 values less than maxvalue);