什么是数据库分区:
以mysql为例,mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件:
frm存放表结构
myd存放表数据
myi存表索引
如果一张表的数据量太大的话,那么myd,myi就会变的很大,查找数据就会变的很慢,这个时候我们可以利用mysql的分区功能。在执行查询的时候,优化器会根据分区定义过滤哪些没有我们需要数据的分区,这样查询就无须全表扫描所有分区,只查找包含需要数据的分区即可。(查询条件包含了可以过滤分区的条件)
分割后的文件
分区和分表的区别:
一张大表进行分区后,他还是一张表,不会变成二张表,对开代码端来说是透明的,但是他存放数据的区块变多了。分区是根据一定的规则把数据文件和索引文件进行了分割,还多出了一个.par文件,打开.par文件后你可以看出他记录了这张表的分区信息。
分区对于程序来说是透明的。
分区一般只能起到水平切分的作用。
创建分区:
1)分区列必须属于此表所有主键(组合)或唯一键(组合)的交集。关于分区列与主键的具体解释。如果没有主键和唯一键则没有此限制。
2)对于原生的RANGE分区,LIST分区,HASH分区,分区字段必须为整数字段名或返回确定整数的函数。
3)添加COLUMNS(支持RANGE分区,LIST分区),关键字可定义非integer范围及多列范围,不过需要注意COLUMNS括号内只能是列名,不支持函数。
4)在RANGE 分区中如果往分区列中插入NULL值会被当作最小的值来处理,在LIST分区中NULL值必须在枚举列表中否则插入失败,在HASH,KEY分区中NULL值会被当作0来处理。
RANGE分区:
根据范围分区,范围应该连续但是不重叠,不使用COLUMNS关键字时RANGE括号内必须为整数字段名或返回确定整数的函数。
//创建range分区表
mysql> CREATE TABLE IF NOT EXISTS `user` (
-> `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
-> `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称',
-> `sex` int(1) NOT NULL DEFAULT '0' COMMENT '0为男,1为女',
-> PRIMARY KEY (`id`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
-> PARTITION BY RANGE (id) (
-> PARTITION p0 VALUES LESS THAN (3),
-> PARTITION p1 VALUES LESS THAN (6),
-> PARTITION p2 VALUES LESS THAN (9),
-> PARTITION p3 VALUES LESS THAN (12),
-> PARTITION p4 VALUES LESS THAN MAXVALUE
-> );
Query OK, 0 rows affected (0.13 sec)
//插入一些数据
mysql> INSERT INTO `test`.`user` (`name` ,`sex`)VALUES ('tank', '0')
-> ,('zhang',1),('ying',1),('张',1),('映',0),('test1',1),('tank2',1)
->