数据库分区
简要说明本技术是什么,有什么用,分类及优势;可以让你快速对此技术有个简而精的了解
-
一句话概括
就是将一个数据量比较大的表,用某种方法把数据从物理上分成若干个小表来存储,从逻辑来看还是一个大表;
主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。
-
分类
分区主要有两种形式:水平分区(row行),垂直分区(column列)
水平分区(Horizontal Partitioning)
对表的行进行分区,表中一行数据是一个完整的个体,一行或多行数据组成一个分区;
例:一个包含一年记录的订单表可以从时间上分为12个分区,每个分区包含一个月的记录。(通过某个表字段列来分割)
垂直分区(Vertical Partitioning)
通过对表的垂直(列)划分来减少目标表的宽度,使某些特定的列被划分到特定的分区;
表中每一列是一个完整的个体,一个或多个列组成一个分区。
例:一个包含了 clob(大文本)字段类型表,而且这个列又不经常被访问,这时候可以划分到另一个分区,在保证它们数据相关性的同时还能提高访问速度。
下面主要讲的是水平分区,也是常采用的分区方式
-
优势
举例说明:有张user表中现在有5000w条数据,主键id和crt_time建了索引,根据创建时间分成100个分区,(假设根据时间均匀分布)每个分区约50W数据
insert | update | delete | select | |
操作 | 新增一条数据,带id和crt_time | 更新一条数据By id | 删除一条数据 By id | 查询 带crt_time |
分区前 | 更新全表crt_time索引5000w | 根据主键id查询5000,命中后更新 | 根据主键id查询5000,命中后删除,更新全表id索引,全表crt_time索引 | 对5000w数据条件查询 |
分区后 | 根据crt_time命中分区,更新分区crt_time索引50W | 根据主键id查询5000,命中后更新 | 根据主键id查询5000,命中后删除,更新全表id索引,分区crt_time索引 | 根据crt_time命中分区,对分区的50W条数据条件查询 |
提升 | crt_time索引更新总数,由5000w减少到50W | 无 | crt_time索引更新总数,由5000w减少到50W | 扫描数据由5000W收敛到50W |
索引维护呈数量级的下降,提高查询效率
——sql语句一定要带分区字段,这样数据库可以根据分区字段把sql快速收敛到目标分区,如果不携带分区字段相当于全表扫描
——默认情况下,oracle的分区表对于分区字段是不允许进行update操作的,如果有对分区字段行进update,就会报错(参照参考文章)
1、性能的提升(Increased performance)
1)改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
2)降低索引的维护压力,更新或新增一条数据只需维护其所在分区的索引,其他分区不做改变;
3) 均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能;如果把这些分区建立在不同的磁盘上,还可以同时对多个分区同时IO提高效率(单线程变多线程)。
还有诸如写操作的锁操(如果不更新全局索引字段如主键ID,则锁的是分区表,对其他分区无影响)作等,都会带来很多显然的好处
1) 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
2) 维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可(分区表可以单独建立维护索引);
优势总结
对于一名非DBA的程序员来说,表分区提高了数据操作的效率,但是SQL必须带上分区字段(如创建时间),且分区字段值一般不可修改
参考文章
理论
https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%88%86%E5%8C%BA/3801074?fr=aladdin
mysql表分区
https://blog.csdn.net/zhanglong_longlong/article/details/52670141
Oracle数据库分区分表以及读写分离
https://www.cnblogs.com/adolfmc/p/5381737.html
ORA-14402: 更新分区关键字列将导致分区的更改
https://www.cnblogs.com/SZ2015/p/4667976.html
数据库分区、分表、分库、分片
https://blog.csdn.net/qq_28289405/article/details/80576614