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 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中的分