mysql 关于range 分区 的认识

msysql> delimiter //  模式进入


Create Table: CREATE TABLE `log_role_gold_change_bak` (
  `username` varchar(50) NOT NULL,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `roleid` bigint(20) NOT NULL,
  `changecount` int(10) NOT NULL,
  `newcount` int(10) NOT NULL,
  `reason` varchar(20) NOT NULL,
  `format_time` varchar(20) NOT NULL,
  `create_time` int(10) NOT NULL,
  PRIMARY KEY (`id`)
)

图:4-1

当 被分区的字段没有在主键上时,会出现上图(4-1)这样的错误。

修改sql:alert table log_role_gold_change_bak drop primary key,add primary key(`id`,`roleid`);

图:4-2

Reorganize of range partitions cannot change total ranges except for last partition where it can extend the range

重组的范围分区不能改变总范围除了最后一个分区,可以扩展范围

如果 想把原来的 分区重新分区的话,必须是在原来的分区里面选择。 //这句没看懂的话 接着往下看(图4-4)

仔细看上图两次 alter 的不同区别;然后再看此图。

图:4-3

所以如果要是第一次 分区以后 过了一段时间 想重新分区的话,就可以这样做了,把最大的那个分区 在分裂就行了。如上图


然后要是看创建分区的 结构执行:

mysql> show create table log_role_gold_change_bak\G;
*************************** 1. row ***************************
       Table: log_role_gold_change_bak
Create Table: CREATE TABLE `log_role_gold_change_bak` (
  `username` varchar(50) NOT NULL,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `roleid` bigint(20) NOT NULL,
  `changecount` int(10) NOT NULL,
  `newcount` int(10) NOT NULL,
  `reason` varchar(20) NOT NULL,
  `create_time` int(10) NOT NULL,
  PRIMARY KEY (`id`,`roleid`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (`roleid`)
(PARTITION p1 VALUES LESS THAN (110) ENGINE = InnoDB index directory='/data/testpath/path1/idx' data directory='/data/testpath/path1/data',
 PARTITION p2 VALUES LESS THAN (10010) ENGINE = InnoDB index directory='/data/testpath/path2/idx' data directory='/data/testpath/path2/data',
 PARTITION p3 VALUES LESS THAN (10011) ENGINE = InnoDB index directory='/data/testpath/path3/idx' data directory='/data/testpath/path3/data',
 PARTITION p4 VALUES LESS THAN MAXVALUE ENGINE = InnoDB index directory='/data/testpath/path4/idx' data directory='/data/testpath/path4/data') */
1 row in set (0.00 sec)

绿色:代表索引目录,蓝色代表数据目录

目录必须有  mysql  读写 权限  chown -R mysql:mysql 路径;

、、、、、、、、、、、仔细看下面的 几个、、、、、、、、、、、、、、、、、、、、、

图4-4


可以看出如果想把s1,s2,s3,s4 重新分割的话,重新分区的 最后一列(p2)必须大于等于重新分割的老分区的一列(s2)

最后结果为:

图4-5

总结 : “多分一” ,“ 一分多”   可以直接分区,但是 多分多的话,要注意分区范围了。

比如:

======一对多===多对一====

less than 10                    

less than 100        《========》    p1  values less than     (10)  或者 less than maxvalue  或者 100    或者101

less than maxvalue
======多对多=======

s1 values less than 10                                            p1    values less than 5    

s2  values less than 100        《========》     p2  values less than     (100)  或者 less than maxvalue   或者101

s3 values  less than maxvalue

**************end*************

ALTER TABLE log_role_gold_change_bak ADD PARTITION (PARTITION s5 VALUES LESS THAN (100000000));

这条sql 语句 只有在 没有  maxvalue  时 才有效,  否则执行时 会报错;

图4-6



针对时间进行分区  看下图的不同:

图4-7

mysql5.5新的函数中增加了一个COLUMNS关键词,如果你想使用MySQL 5.1中的分

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值