首页 > 代码库 > MySQL分区
MySQL分区
P226)MySQL分区的优点主要包括一下4个方面:
- 和单个磁盘或者文件系统分区相比,可以存储更多数据
- 优化查询。在Where子句中包含分区条件时,可以只扫描必要的一个或多个分区来提高查询效率;同时在涉及SUM()和COUNT()这类聚合函数的查询时,可以容易的在每个分区上并行处理,最终只需要汇总所有分区得到的结果。
- 对于已经过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据。
- 跨多个磁盘来分散数据查询,以获得更大的查询吞吐量。
分区类型:
- range分区:基于一个给定连续区间范围,把数据分配到不同的分区。
- list分区:类似range分区,区别在list分区是基于枚举出的值列表分区,range是基于给定的连续区间范围分区。
- hash分区:基于给定的分区个数,把数据分配到不同的分区
- key分区:类似于hash分区
P230)range分区功能特别适用于以下两种情况:
- 当需要删除过期数据时,只需要简单的alter table emp drop partition p0来删除p0分区中的数据,对于具有上百万条记录的表来说,删除分区要比运行一个delete语句有效得多。
- 经常运行包含分区键的查询,MySQL可以很快的确定只有某一个或者某些分区需要扫描,因为其他分区不可能包含有符合该where子句的任何记录。
P231)List分区是建立离散的值列表告诉数据库特定的值属于哪个分区,list分区在很多方面类似range分区,区别在list分区是从属于一个枚举列表的值的集合,range分区是从属于一个连续区间值的集合。
如果试图插入的列值(或者分区表达式的返回值)不包含分区值列表时,那么insert操作将失败并报错。将要匹配的任何值都必须在值列表中找得到。
P232)Columns分区又细分为range columns分区和list columns分区,这两个分区都支持整数、日期时间、字符串三大数据类型。
Columns分区还支持多列分区。range columns分区建的比较是基于元祖(多列时)的比较,也就是基于字段组的比较。
P235)Hash分区主要用来分散热点读,确保数据在预先确定个数的分区中尽可能平均分布。对一个表执行Hash分区时,MySQL会对分区键应用一个散列函数,以此确保数据应当放在N个分区中的哪个分区中。
MySQL支持两种Hash分区,常规Hash分区和线性Hash分区(Linear Hash分区)。常规Hash分区使用的是取模算法,线性Hash分区使用的是一个线性的2的幂的运算法则。
P237)常规Hash分区方式看上去挺不错的,通过取模的方式来使数据尽可能平均分布在每个分区中,让每个分区管理的数据都减少了,提高了查询的效率;可是当我们需要增加分区或者合并分区的时候,问题就出现了。假设原来是5个常规Hash分区,现在需要新增一个常规Hash分区,那么由于取模算法发生了改变,使得原来5个分区中的数据大部分都需要计算重新分区。常规Hash在分区管理上带来的代价太大了,不适合需要灵活变分区的需求。为了降低分区管理上的代价,MySQL提供了线性Hash分区,分区函数是一个线性的2的幂运算法则。
P238)线性Hash分区的优点是,在分区维护(包含增加、删除、合并、拆分分区)时,MySQL能够处理得更加迅速;缺点是,对比常规Hash分区(取模)的时候,线性Hash各个分区之间数据的分布不大均衡。
P239)Key分区非常类似于Hash分区,只不过Hash分区允许使用用户自定义的表达式,而Key分区不允许使用用户自定义的表达式,需要使用MySQL服务器提供的Hash函数;同时Hash分区只支持整数分区,而Key分区支持使用除BLOB和Text类型外其他类型的列作为分区键。
MySQL分区