优化:分区

特点

分区有利于管理非常大的表,它采用分而治之的逻辑,分区引入了分区键的概念,分区键用于根据某个区间值(或者范围值)、特定值列表或者hash函数值执行数据的聚集,让数据根据规则分布在不同的分区中

分区类型

range分区

给定一个连续区间的范围值进行分区,某个字段的值满足这个范围就会被分配到该分区。适用于字段的值是连续的区间的字段,如 日期范围, 连续的数字。

语法

create table <table> (

// 字段

) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1

partition by range (分区字段) (

partition <分区名称> values less than (Value),

partition <分区名称> values less than (Value),

...

partition <分区名称> values less than maxvalue

);

字段含义

less than : 表示小于

Value : 表示要小于某个具体的值,如 less than (10) 那么分区字段的值小于10的都会被分到这个分区

maxvalue: 表示一个最大的值

注意

1:range 对应的分区键值必须是数字值,可以使用range columns(分区字段) 对非int型做分区,如字符串,对于日期类型的可以使用year()、to_days()、to_seconds()等函数

2:使用range分区时表结构要么没有主键,要么分区字段必须是主键。

list分区

设置若干个固定值进行分区,如果某个字段的值在这个设置的值列表中就会被分配到该分区。适用于字段的值区分度不高的,或者值是有限的,特别是像枚举这样特点的列

语法

create table <table> (

// 字段

) ENGINE=数据库引擎 DEFAULT CHARSET=utf8 AUTO_INCREMENT=1

partition by LIST (分区字段或者基于该字段的返回的整数值的表达式) (

partition <分区名称> values IN (Value1,Value2, Value3),

...

partition <分区名称> values IN (Value4, Value5),

);

hash分区

主要用来分散热点读,确保数据在预先确定个数的分区中可能的平均分布。对一个表执行Hash分区时,mysql会对分区键应用一个散列函数,以此确定数据应当放在N个分区中的哪个分区

mysql支持两种hash分区

1:常规hash分区使用的是取模算法,对应一个表达式expr是可以计算出它被保存到哪个分区中

2:线性hash分区使用的是一个线性的2的幂运算法则

key分区

类似于hash分区

子分区

分区表中对每个分区的再次分割,又被称为复合分区,支持对range和list进行子分区,子分区即可以使用hash分区也可以使用key分区。复合分区适用于保存非常大量的数据记录

分区优势

1:和单个磁盘或者文件系统分区相比,可以存储更多数据

2:优化查询。在where子句中包含分区条件时,可以只扫描必要的一个或者多个分区来提高查询效率;同时在涉及sum()和count()这类聚合函数的查询时,可以容易的在每个分区上并行处理,最终只需要汇总所有分区得到的结果

3:对于已经过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据

4:跨多个磁盘来分散数据查询,以获得更大的查询吞吐量

分区和分表的区别

实现方式上

1:mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。

2:分区不一样,一张大表进行分区后,他还是一张表,不会变成二张表,但是他存放数据的区块变多了

数据处理上

1:分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面

2:分区,不存在分表的概念,分区只不过把存放数据的文件分成了许多小块,分区后的表呢,还是一张表。数据处理还是由自己来完成。

提高性能上

1:分表后,单表的并发能力提高了,磁盘I/O性能也提高了。并发能力为什么提高了呢,因为查寻一次所花的时间变短了,如果出现高并发的话,总表可以根据不同的查询,将并发压力分到不同的小表里面。磁盘I/O性能怎么搞高了呢,本来一个非常大的.MYD文件现在也分摊到各个小表的.MYD中去了。

2:mysql提出了分区的概念,我觉得就想突破磁盘I/O瓶颈,想提高磁盘的读写能力,来增加mysql性能。

在这一点上,分区和分表的测重点不同,分表重点是存取数据时,如何提高mysql并发能力上;而分区呢,如何突破磁盘的读写能力,从而达到提高mysql性能的目的。

分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等

发布了50 篇原创文章 · 获赞 2 · 访问量 2278

猜你喜欢

转载自blog.csdn.net/eafun_888/article/details/104738696