/ -------------------- 写在最前面 --------------------------------/html
若是表分区使用的是:innodb数据库引擎,要把分区技术作成功必须设置表为独立表空间mysql
具体参考:https://www.jb51.net/article/134901.htm,或下面sql
/ -------------------- 写在最前面 -- end --------------------------------/数据库
1、什么是表分区
通俗地讲表分区是将一大表,根据条件分割成若干个小表。mysql5.1开始支持数据表分区了。
如:某用户表的记录超过了1000万条,那么就能够根据入库日期将表分区,也能够根据所在地将表分区。固然也可根据其余的条件分区。
2、为何要对表进行分区
为了改善大型表以及具备各类访问模式的表的可伸缩性,可管理性和提升数据库效率。
分区的一些优势包括:
1)、与单个磁盘或文件系统分区相比,能够存储更多的数据。
2)、对于那些已经失去保存意义的数据,一般能够经过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些状况下,添加新数据的过程又能够经过为那些新数据专门增长一个新的分区,来很方便地实现。一般和分区有关的其余优势包括下面列出的这些。MySQL分区中的这些功能目前尚未实现,可是在咱们的优先级列表中,具备高的优先级;咱们但愿在5.1的生产版本中,能包括这些功能。
3)、一些查询能够获得极大的优化,这主要是借助于知足一个给定WHERE语句的数据能够只保存在一个或多个分区内,这样在查找时就不用查找其余剩余的分区。由于分区能够在建立了分区表后进行修改,因此在第一次配置分区方案时还未曾这么作时,能够从新组织数据,来提升那些经常使用查询的效率。
4)、涉及到例如SUM()和COUNT()这样聚合函数的查询,能够很容易地进行并行处理。这种查询的一个简单例子如 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id;”。经过“并行”,这意味着该查询能够在每一个分区上同时进行,最终结果只需经过总计全部分区获得的结果。
5)、经过跨多个磁盘来分散数据查询,来得到更大的查询吞吐量。服务器
3、分区类型
· RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
· LIST分区:相似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
· HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数能够包含MySQL 中有效的、产生非负整数值的任何表达式。
· KEY分区:相似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。less
1.RANGE分区函数
基于属于一个给定连续区间的列值,把多行分配给分区。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操做符来进行定义。如下是实例。工具
2.LIST分区post
相似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
LIST分区经过使用“PARTITION BY LIST(expr)”来实现,其中“expr” 是某列值或一个基于某个列值、并返回一个整数值的表达式,而后经过“VALUES IN (value_list)”的方式来定义每一个分区,其中“value_list”是一个经过逗号分隔的整数列表。性能
3.HASH分区
基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数能够包含MySQL 中有效的、产生非负整数值的任何表达式。
要使用HASH分区来分割一个表,要在CREATE TABLE 语句上添加一个“PARTITION BY HASH (expr)”子句,其中“expr”是一个返回一个整数的表达式。它能够仅仅是字段类型为MySQL 整型的一列的名字。此外,你极可能须要在后面再添加一个“PARTITIONS num”子句,其中num 是一个非负的整数,它表示表将要被分割成分区的数量。
4.KSY分区
相似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
不一样的表分区对好比下:
下面来操做MySQL表分实例操做主要讲解 Range分区技术
注意为了查看方便我这边对mysql操做都是用客户端工具Navicat For Mysql 进行链接操做。
1.建立分区表,按日期和年份拆分 使用的是 myisam 引擎
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
-- 建立表分区,按日期的年份拆分
create table part_tab(c1
int
default
null
,c2 varchar(30)
default
null
,c3 date
default
null
) engine=myisam
PARTITION
by
range(year(c3))(
PARTITION p0 values less than(2007),
PARTITION p1 values less than(2008),
PARTITION p2 values less than(2009),
PARTITION p3 values less than(2010),
PARTITION p4 values less than(2011),
PARTITION p5 values less than(2012),
PARTITION p6 values less than(2013),
PARTITION p7 values less than(2014),
PARTITION p8 values less than(2015),
PARTITION p9 values less than(2016),
PARTITION p10 values less than MAXVALUE);
-- 最后一行 ,考虑可能 最大值 默认分区
|
2.建立未分区表,主要用于做对比表字段和结构和分区表如出一辙。
1
|
create table no_part_tab(c1
int
default
null
,c2 varchar(30)
default
null
,c3 date
default
null
) engine=myisam;
|
3.建立测试数据这里使用存储过程快速建立100万行数据测试数据越多越方便查看,这里只测试100万行根据我的需求插入,因只是用日期分区,其余列不住细节深究。只关注日期列。
1
2
3
4
5
6
7
8
9
10
|
create PROCEDURE load_part_tab()
begin
declare i
int
default
0;
while
i<1000000
do
insert
into
part_tab values(i,
'test data part'
,
adddate(
'2007-01-01'
,(rand(i)*36520) mod 3652));
set
i=i+1;
end
while
;
end;
|
4.执行存储过程插入数据
1
|
call load_part_tab();
|
5.进入查看咱们刚才的分区表,数据库安装都是常规的路径,测试数据名称为test
1
2
|
[root@localhost /]# cd usr/local/mysql/data/test
[root@localhost test]# ls
|
显示如上信息说明已经建立完成。
6.复制数据到未分区表no_part_tab
1
|
insert
into
no_part_tab
select
*
from
part_tab;
|
7.测试SQL 的性能分别查询1年的数据。
7.1)分区表的性能
7.2)未分区表的性能
查询时间很是明显的区别,注意数据量越大越明显。
8.为什么会分区会有如此大的区别咱们经过查询计划分析。
8.1)分区的查询计划影响的行数是:99813
8.2)未分区查询计划影响的行数是:1000000
很明显查询条件的数据是在p1分区 因此查询的只会查询这分区,查询效果就显而易见。
9.增长未索引字段查询
1
|
select
*
from
part_tab
where
c3>date
'2007-01-01'
and c3<date
'2017-12-31'
and c2=
'mysql'
;
|
查看执行时间2.55s
1
|
select
*
from
no_part_tab
where
c3>date
'2007-01-01'
and c3<date
'2017-12-31'
and c2=
'mysql'
;
|
查看执行时间11.16s
对比时间差距仍是很大的具体查询时间根据我的计算机性能已经数据大小进行测试,数据量越大越明显。
四.innodb表分区
在innodb数据库引擎中要把分区技术作成功必须设置表为独立表空间特别注意这点。
1.什么是共享表空间和独立表空间
贡献表空间已经独立表空间都是针对数据的存储方式而言的。
贡献表空间:某一个数据库的全部的表数据,索引文件所有放在一个文件中,默认这个共享表空间的文件路径在data目录下。默认的文件名为ibdata1初始大小为10M。
独占表空间:每一个表都将会生成意独立文件方式来进行存储,每一个表都有一个.frm表描述,还有一个.dbd文件.其中这个文件包括了单独一个表数据内容以及索引内容,默认状况下它的存储位置也是在表的位置之中。
2.共享表空间:
优势:
能够放表空间分红多文件存放各个磁盘上(表空间文件大小不受表大小的限制,如一个表能够分布在不一样的文件上)。
数据和文件放一块儿方便管理。
缺点:
全部的数据和索引存放到一个文件中讲有一个很大的文件,虽然能够把一个大文件分红多个小文件,可是多个表及索引在表空间中混合存储,这样对于一个表作了大量删除操做后表空间中将会有大量的空隙,特别是对于统计分析,日志系统这类应用最不合适用共享表空间。
3.实际操做
开启innodb数据库引擎独立表空间。
编辑my.cnf 增长innodb_file_per_table=1
1
|
[root@localhost test]# vi /etc/my.cnf
|
只有设置了innodb 引擎的独立表空间才能作成功表分区,特别注意。【win下无需设置】