mysql表分区

show variables 可以查看系统变量及其值

show variables like '%part%';查看是否可以表分区

show variables like '%event%' ;查看事件是否开启

表分区的好处

1.数据可以存放到多个磁盘上,可以存放更多数据

2.查询的优化,按条件查询分区的数据;跨分区查询时,各个分区同时进行查询,提高了查询效率;

   跨磁盘查询,提高查询的吞吐量

3.维护方便,可以通过删除分区来删除数据。

 分区类型

对某个存在主键的表进行分区,

A PRIMARY KEY must include all columns in the table's partitioning function

,当然了没有主键也可以进行分区

1.RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。

create table role
(
id int(20),
name varchar(50),
dateid int,
PRIMARY key(id)
)
PARTITION by RANGE(id)(
PARTITION p0 VALUES less than (10),
PARTITION p1 VALUES less than (20)
)

上述表无法插入20以及以上的数据,添加分区p2,可以插入30以内的数据

alter table role add PARTITION(PARTITION p2 VALUES less than (30));

删除分区,同时会删除掉该分区的所有数据

 alter table role drop PARTITION p1

添加一个包含其他值的分区

alter table role add PARTITION(PARTITION p3 VALUES less than (MAXVALUE));

2.LIST分区

类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

create table itemsq
(
itemid int(20),
item_name varchar(50),
type int
)
PARTITION by list(type)(
PARTITION p0 VALUES in (1,3,4,6,7),
PARTITION p1 VALUES in (2,5,8,9,0)
);

list没有类型MAXVALUE的定义

 LIST分区可以和RANGE分区结合起来生成一个复合的子分区,也可以与HASH和KEY分区结合起来生成复合的子分区。

3.hash分区

基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。

create table role100
(
id int(20),
name varchar(50),
dateid int
)
PARTITION by HASH(id%4)
PARTITIONS 4

4.KEY分区

KEY 分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

create table role10
(
id int(20),
name varchar(50),
dateid int
)
PARTITION by KEY(id)
PARTITIONS 10

当然还有其他的分区方式............

例:

CREATE TABLE `OnlineCount` (
  `gameid` int(10) NOT NULL DEFAULT '0',
  `writetime` datetime DEFAULT NULL,
  `daynum` int(11) NOT NULL,
  `timestr` varchar(10) NOT NULL,
  `zoneid` int(10) NOT NULL DEFAULT '0',
  `platid` int(10) NOT NULL DEFAULT '0',
  `onlinenum` int(10) NOT NULL DEFAULT '0',
  `onlineipnum` int(11) DEFAULT '0',
  PRIMARY KEY (`daynum`,`gameid`,`zoneid`,`platid`,`timestr`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (daynum)
(PARTITION part201901 VALUES LESS THAN (20190201) ENGINE = MyISAM,
 PARTITION part201902 VALUES LESS THAN (20190301) ENGINE = MyISAM,
 PARTITION part201903 VALUES LESS THAN (20190401) ENGINE = MyISAM,
 PARTITION part201904 VALUES LESS THAN (20190501) ENGINE = MyISAM,
 PARTITION part201905 VALUES LESS THAN (20190601) ENGINE = MyISAM,
 PARTITION part201906 VALUES LESS THAN (20190701) ENGINE = MyISAM) */;

添加分区

if not EXISTS(
select * from information_schema.`PARTITIONS` where TABLE_SCHEMA='zqbwebgame'
and TABLE_NAME='OnlineCount'
and PARTITION_NAME=CONCAT('part',DATE_FORMAT(DATE_ADD(SYSDATE(),INTERVAL 1 MONTH),'%Y%m'))
)
THEN
set @partname=CONCAT('part',DATE_FORMAT(DATE_ADD(SYSDATE(),INTERVAL 1 MONTH),'%Y%m'));
set @part=concat(DATE_FORMAT(DATE_ADD(SYSDATE(),INTERVAL 2 MONTH),'%Y%m'),'01');
set @sqlstr=concat('alter table OnlineCount add PARTITION(PARTITION ',@partname,' VALUES less than(',@part,'))');
PREPARE stmt1 FROM @sqlstr;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
end IF;

原文地址:https://www.cnblogs.com/playforever/p/8036210.html