MySQL性能优化分区之实战( 四 )


create table ts ( id int,purchased date) partition by range(year(purchased))subpartition by hash(to_days(purchased)) subpartitions 2 ( partition p0 values less than (1990), partition p0 values less than (2000), partition p0 values less than maxvalue);CREATE TABLE IF NOT EXISTS `sub_part` ( `news_id` int(11) NOT NULL COMMENT '新闻ID', `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '新闻内容', `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=utf8PARTITION 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));九:管理分区
mysql不禁止在分区键值上使用null,分区键可能是一个字段或者一个用户定义的表达式,一般情况下,mysql的分区把null值当做零值或者一个最小值进行处理 。range分区中,null值会被当做最小值来处理;list分区中null值必须出现在枚举列表中,否则不被接受;hash/key分区中,null值会被当做领值来处理 。
mysql提供了添加、删除、重定义、合并、拆分分区的命令,这些操作都可以通过alter table 命令来实现
-- 删除list或者range分区(同时删除分区对应的数据)alter table <table> drop partition <分区名称>;-- 新增分区-- range添加新分区alter table <table> add partition(partition p4 values less than MAXVALUE);-- list添加新分区alter table <table> add partition(partition p4 values in (25,26,28));-- hash重新分区alter table <table> add partition partitions 4;-- key重新分区alter table <table> add partition partitions 4;-- 子分区添加新分区,虽然我没有指定子分区,但是系统会给子分区命名的alter table <table> add partition(partition p3 values less than MAXVALUE);-- range重新分区ALTER TABLE user REORGANIZE PARTITION p0,p1,p2,p3,p4 INTO (PARTITION p0 VALUES LESS THAN MAXVALUE);-- list重新分区ALTER TABLE <table> REORGANIZE PARTITION p0,p1,p2,p3,p4 INTO (PARTITION p0 VALUES in (1,2,3,4,5));分区优点1,分区可以分在多个磁盘,存储更大一点
2,根据查找条件,也就是where后面的条件,查找只查找相应的分区不用全部查找了
3,进行大数据搜索时可以进行并行处理 。
4,跨多个磁盘来分散数据查询,来获得更大的查询吞吐量




推荐阅读