mysql分区详解
当mysql的一张表的数据达到1000万条或者更多的时候,会出现性能大幅下降。当然性能的下降的比例由系统的架构,应用程序,数据库的索引,
服务器硬件等多个因素决定。当数据库多达上亿的数据量,分表之后单个表的数据也达到上千万的数量,这个时候对这样的数据进行一些sql脚本的运行,
均会影响系统的效率,甚至一条sql的运行会压垮整个数据库。这时我们就可以用对表进行分区来提高效率。
MySQL分区类型
- range:基于一个给定的连续区间范围,把数据分配到不同的分区
- list:类似于range分区,区别在list分区是基于枚举出来的值列表分区,range是基于给定的连续区间范围分区
无论那种分区类型,要么分区表上没有主键/唯一健,要么分区表的主键/唯一健必须包含在分区健,也就是说不能使用主键/唯一健字段之外的字段分区
range分区
按照range分区的表是利用取值范围将数据分成分区,区间要**连续**并且不能重叠。下面我们创建一张range_talbe以range分区,脚本如下:
CREATE TABLE `range_table` (
`id` int(11) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`age` int(11) not NULL,
`addr` varchar(150) DEFAULT NULL
)
partition by range (age)(
partition p0 values less than (10),
partition p1 values less than (20),
partition p2 values less than (30),
partition p3 values less than (40),
partition p4 values less than maxvalue
);
接下来我们对这张表进行insert,update,delete,select 一些简单语句的操作。
首先我们来执行下面这条语句:
insert into range_table (id,name,age,addr) values (1,'steve',15,'上海市松江区');
explain partitions select * from range_table where age=15;
+—-+————-+————-+————+——+—————+——+———+——+——+————-+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+————-+————+——+—————+——+———+——+——+————-+
| 1 | SIMPLE | range_table | p1 | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
+—-+————-+————-+————+——+—————+——+———+——+——+————-+
1 row in set (0.00 sec)
通过上面的语句我们知道上面的插入语句的内容是放在p1这个分区快中的。当然了如果要删除p1这个区块的内容的话,只要删除这个区块来删除这个区块上面的数据,对于具有上百万条记录来说,删除分区要比运行一个delete语句有效的多。
经常运行包含分区建查询,MySQL可以很快的确定只有某一个或者某些分区需要扫描,因为其他分区不可能包含有符合该where子句的任何记录
list分区
list分区是建立离散值的列表告诉数据库特定的值属于哪个分区,list分区在很多方面类似于range分区,区别在于list分区是从属于一个枚举列表的值的集合,range分区是从属于一个连续区间值的集合。
create table list_table(
id int not null,
bn varchar(100),
amount int
)
partition by list(amount)(
partition p0 values in (1,10),
partition p2 values in (31),
partition p1 values in (11,20)
);
list分区特性:list分区不必声明任务特定的顺序。