加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

MYSQL数据库MySQL数据库分区功能的使用教程

发布时间:2020-12-24 10:01:17 所属栏目:编程 来源:网络整理
导读:《MYSQL数据库MySQL数据库分区功能的使用教程》要点: 本文介绍了MYSQL数据库MySQL数据库分区功能的使用教程,希望对您有用。如果有疑问,可以联系我们。 零,什么是数据库分区 来说一下什么是数据库分区,以mysql为例.mysql数据库中的数据是以文件的形势存在

?
第四个区块已删除??
MYSQL实例

[root@BlackGhost test]# ls |grep user |xargs du -sh 
4.0K  user#P#p0.MYD 
4.0K  user#P#p0.MYI 
4.0K  user#P#p1.MYD 
4.0K  user#P#p1.MYI 
4.0K  user#P#p2.MYD 
4.0K  user#P#p2.MYI 
4.0K  user#P#p3.MYD 
4.0K  user#P#p3.MYI 
12K  user.frm 
4.0K  user.par 

??
MYSQL实例

/*可以对现有表进行分区,并且会按蜃远慕碇械氖莘峙湎嘤Φ姆智 
中,这样就比较好了,可以省去很多事情,看下面的操作*/ 
mysql> alter table aa partition by RANGE(id) 
 -> (PARTITION p1 VALUES less than (1),-> PARTITION p2 VALUES less than (5),-> PARTITION p3 VALUES less than MAXVALUE); 
Query OK,15 rows affected (0.21 sec)  //对15数据进行分区 
Records: 15 Duplicates: 0 Warnings: 0 

?
总共有15条??
MYSQL实例

mysql> select count(*) from aa; 
+----------+ 
| count(*) | 
+----------+ 
|    15 | 
+----------+ 
1 row in set (0.00 sec) 

?
删除一个分区??
MYSQL实例

mysql> alter table aa drop partition p2; 
Query OK,0 rows affected (0.30 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

?
只有11条了,说明对现有的表分区成功了?
MYSQL实例

mysql> select count(*) from aa; 
+----------+ 
| count(*) | 
+----------+ 
|    11 | 
+----------+ 
1 row in set (0.00 sec)  

3,list分区
LIST分区中每个分区的定义和选择是基于某列的值从属于一个值列表集中的一个值,而RANGE分 区是从属于一个连续区间值的集合.MYSQL实例

//这种方式失败 
mysql> CREATE TABLE IF NOT EXISTS `list_part` ( 
 ->  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',->  `province_id` int(2) NOT NULL DEFAULT 0 COMMENT '省',->  PRIMARY KEY (`id`) 
 -> ) ENGINE=INNODB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 
 -> PARTITION BY LIST (province_id) ( 
 ->   PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8),->   PARTITION p1 VALUES IN (9,10,11,12,16,21),->   PARTITION p2 VALUES IN (13,14,15,19),->   PARTITION p3 VALUES IN (17,18,20,22,23,24) 
 -> ); 
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function 
 
//这种方式成功 
mysql> CREATE TABLE IF NOT EXISTS `list_part` ( 
 ->  `id` int(11) NOT NULL COMMENT '用户ID',1为女' 
 -> ) ENGINE=INNODB DEFAULT CHARSET=utf8 
 -> PARTITION BY LIST (province_id) ( 
 ->   PARTITION p0 VALUES IN (1,24) 
 -> ); 
Query OK,0 rows affected (0.33 sec)

?
上面的这个创建list分区时,如果有主的话,分区时主键必须在其中,不然就会报错.如果我不用主键,分区就创建成功了,一般情况下,一个张表肯定会有一个主键,这算是一个分区的局限性吧.
如果对数据进行测试,请参考range分区的测试来操作MYSQL实例

4,hash分区
HASH分区主要用来确保数据在预先确定数目的分区中平均分布,你所要做的只是基于将要被哈希的列值指定一个列值或表达式,以 及指定被分区的表将要被分割成的分区数量.MYSQL实例

mysql> CREATE TABLE IF NOT EXISTS `hash_part` ( 
 ->  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '评论ID',->  `comment` varchar(1000) NOT NULL DEFAULT '' COMMENT '评论',->  `ip` varchar(25) NOT NULL DEFAULT '' COMMENT '来源IP',->  PRIMARY KEY (`id`) 
 -> ) ENGINE=INNODB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 
 -> PARTITION BY HASH(id) 
 -> PARTITIONS 3; 
Query OK,0 rows affected (0.06 sec) 

测试请参考range分区的操作MYSQL实例

5,key分区
按照KEY进行分区类似于按照HASH分区,除了HASH分区使用的用户定义的表达式,而KEY分区的 哈希函数是由MySQL 服务器提供.MYSQL实例

mysql> CREATE TABLE IF NOT EXISTS `key_part` ( 
 ->  `news_id` int(11) NOT NULL COMMENT '新闻ID',->  `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '新闻内容',->  `u_id` varchar(25) NOT NULL DEFAULT '' COMMENT '来源IP',->  `create_time` DATE NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '时间' 
 -> ) ENGINE=INNODB DEFAULT CHARSET=utf8 
 -> PARTITION BY LINEAR HASH(YEAR(create_time)) 
 -> PARTITIONS 3; 
Query OK,0 rows affected (0.07 sec) 

测试请参考range分区的操作MYSQL实例

6,子分区
子分区是分区表中每个分区的再次分割,子分区既可以使用HASH希分区,也可以使用KEY分区.这 也被称为复合分区(composite partitioning ).
1,如果一个分区中创建了子分区,其他分区也要有子分区
2,如果创建了了分区,每个分区中的子分区数必有相同
3,同一分区内的子分区,名字不相同,不同分区内的子分区名子可以相同(5.1.50不适用)MYSQL实例

mysql> CREATE TABLE IF NOT EXISTS `sub_part` ( 
 ->  `news_id` int(11) NOT NULL COMMENT '新闻ID',->  `u_id` int(11) NOT NULL DEFAULT 0s COMMENT '来源IP',->  `create_time` DATE NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '时间' 
 -> ) ENGINE=INNODB DEFAULT CHARSET=utf8 
 -> PARTITION BY RANGE(YEAR(create_time)) 
 -> SUBPARTITION BY HASH(TO_DAYS(create_time))( 
 -> PARTITION p0 VALUES LESS THAN (1990)(SUBPARTITION s0,SUBPARTITION s1,SUBPARTITION s2),-> PARTITION p1 VALUES LESS THAN (2000)(SUBPARTITION s3,SUBPARTITION s4,SUBPARTITION good),-> PARTITION p2 VALUES LESS THAN MAXVALUE(SUBPARTITION tank0,SUBPARTITION tank1,SUBPARTITION tank3) 
 -> ); 
Query OK,0 rows affected (0.07 sec) 

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读