分区是将一个表的数据按照某种方式,比如按照时间上的月份,分成多个较小的,更容易管理的部分,但是逻辑上仍是一个表。我们在此之前已经讲过MySQL分区表的原理,分区有利于管理非常大的表,它采用分而治之的逻辑,便于对数据的管理。本文我们就来进一步了解MySQL分区表,详细看一下MySQL分区表类型究竟有几个?
MySQL支持多种分区表,我们看到最多的是根据范围进行分区,每个分区存储落在某个范围的记录,分区表达式可以是列,也可以是包含列的表达式。分区的一个主要目的是将数据按照一个较粗的粒度分在不同的表中,这样做可以将相关数据存放在一起,另外,如果想一次批量删除整个分区的数据也会变的很方便。实现分区表的代码实际上是对一组底层表的句柄对象的封装。对分区表的请求,都会通过句柄对象转化成对存储引擎的接口调用。
MySQL支持如下几种类型的分区:
1.RANGE分区:行数据基于一个给定连续范围分区。不好理解,看例子吧。5.5版本开始支持RANGE COLUMNS分区。
2.LIST分区:同RANGE,区别在于给定的不是连续范围,是离散的值。5.5版本开始支持LIST COLUMNS分区。
3.HASH分区:根据用户自定义的表达式的返回值进行分区,返回值不能是负数。
4.KEY分区:根据MySQL内部提供的哈希函数进行分区。
5.COLUMNS分区:5.5版本开始支持,可以直接使用非整形的数据进行分区,分区根据类型直接比较而得,不需要转换为整形。
无论创建何种类型的分区,如果表中存在主键或唯一索引的列,则分区列必须是主键或唯一索引的一部分。索引列可以是null值。在没有主键和唯一索引的表中可以指定任意列为索引列。表中只能最多有一个唯一索引,即primary key 和unique key不能同时存在,primary key包含在unique key中时除外。
create table sales(
order_date datetime not null,
-- other columns omitted
) engine=innodb partition by range(year(order_date)) (
partition p_2010 values less than (2010),
partition p_2011 values less than (2011),
partition p_2012 values less than (2012),
partition p_catchall values less than maxvalue
);
partition分区子句中可以使用各种函数,但有一个要求,表达式返回的值要是一个确定的整数,且不能是一个常数。MySQL还支持键值,哈希和列表分区,这其中有些还支持子分区,不过我们在生产环境中很少见到。
我们还看到的一些其他的分区技术包括:
根据键值进行分区,来减少InnoDB的互斥竞争。
使用数据模函数来进行分区,然后将数据轮询放入不同的分区。
假设表有一个自增的主键列id,希望根据时间将最近的热点数据集中存放,那么必须将时间戳包含在主键当中才行,而这和主键本身的意义相矛盾,这种情况下可以使用这样的分区表达式来实现相同的目的:Hash(id div 100000) ,这将为100万数据简历一个分区,这样一方面实现了当初的分区目的,另一方面比起使用时间范围分区还避免了一个问题,就是当超过一定阀值时,如果使用时间范围分区就必须新增分区。
当然,分区技术的应用远不止与此,区分各种分区表的类型并加以利用,我们才能更好地使用MySQL数据库查询和利用各种各样的数据。本站的MySQL教程中,对mysql分区表有着十分详细的讲解,想要深入学习的小伙伴一定不要错过。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习