MySQL表分区就是把一张表根据设定好的条件下把表切分成若干个小表相互之间,在MySQL的5.1版本以后就开始支持表分区的功能,在使用表的分区后会使MySQL中大表在平时查询统计时性能提升。使用MySQL的表分区有以下这些优点:
1.与单个磁盘或文件系统分区相比,可以存储更多的数据
2.很容易就能删除不用或者过时的数据
3.一些查询可以得到极大的优化
4.涉及到 SUM()
/COUNT
() 等聚合函数时,可以并行进行
5.IO吞吐量更大
RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
其中我们比较常用的就是分区方式就是按字段中的时间来分区那么就选用RANGE分区方式来进行分区在这里就说一说最常用的使用时间条件来进行表分区,按时间分区可以按照年月日等条件用来分区,因为是按时间条件分区所以在这里就选用RANGE分区,在这里分区的切条件判断有三种:
LESS THAN:如果是数值就是小于等于,时间则是小于
LESS THAN
MAX
:不等于
IN
:包含于某某区间
而切分时的条件可以用day()、to_days()等相关时间函数都可以,需要注意的是必须是返回值是整形的。如下有一张表
其中按时间字段date按天分区,首先需要把date字段改成主键,后添加分区切分规则
ALTER
TABLE
`employee_tbl`
DROP
PRIMARY
KEY
,
ADD
PRIMARY
KEY
(`id`, `
date
`);
-- 之前id是主键,所以这里第2主键为联合主键
ALTER
TABLE
`employee_tbl`
ADD
PRIMARY
KEY
(`
date
`);
-- 这里为了便于管理分区名都已“p时间”来命名
ALTER
TABLE
`employee_tbl` PARTITION
BY
RANGE (to_days(
date
)) (
PARTITION `p20171101`
VALUES
LESS THAN (to_days(
'20171101'
)),
PARTITION `p20171102`
VALUES
LESS THAN (to_days(
'20171102'
)),
PARTITION `p20171103`
VALUES
LESS THAN (to_days(
'20171103'
)),
PARTITION `p20171104`
VALUES
LESS THAN (to_days(
'20171104'
)),
PARTITION `p20171105`
VALUES
LESS THAN (to_days(
'20171105'
)),
PARTITION `p20171106`
VALUES
LESS THAN (to_days(
'20171106'
)),
PARTITION `p20171107`
VALUES
LESS THAN (to_days(
'20171107'
)),
PARTITION `p20171108`
VALUES
LESS THAN (to_days(
'20171108'
)),
PARTITION `p20171109`
VALUES
LESS THAN (to_days(
'20171109'
)),
PARTITION `p20171110`
VALUES
LESS THAN (to_days(
'20171110'
))
);
这样按天进行分区就创完毕,当然如果感觉不够满意还可以重新分区,后期添加分区也很简单:
ALTER
TABLE
employee_tbl
ADD
PARTITION (PARTITION p20171111
VALUES
LESS THAN (TO_DAYS (
'2017-11-11'
)));
删除分区:
ALTER
TABLE
employee_tbl
DROP
PARTITION p20171101;
最后我们可以通过查询MySQL的系统字典库得知所有的分区详情信息
SELECT
*
FROM
information_schema. PARTITIONS t
WHERE
t.PARTITION_NAME
IS
NOT
NULL
在分区创建后可以通过过程和事件控制自动增加表分区。