首页 > 数据库 > MySQL > 正文

MySQL数据库表分区注意事项大全【推荐】

2024-07-24 12:51:01
字体:
来源:转载
供稿:网友

表分区与数据库分区是不一样的那么碰到表分区使用时我们要注意一些什么事情呢,今天我们来看一篇关于MySQL数据库表分区注意事项的细节。

1、分区列索引约束

若表有primary key或unique key,则分区表的分区列必须包含在primary key或unique key列表里,这是为了确保主键的效率,否则同一主键区的东西一个在A分区,一个在B分区,显然会比较麻烦。

2、各分区类型条件

range 每个分区包含那些分区表达式的值位于一个给定的连续区间内的行。这些区间要连续且不能相互重叠

list只支持整形字段或返回整形数的表达式,每个分区列表里的值列表必须整数

hash类型只支持整形字段或返回整形数的表达式

key类型只支持列名形式(可一个或多个列名),不支持表达式

3、分区可用函数

ABS()

CEILING() (see CEILING() and FLOOR(), immediately following this list)

DAY()

DAYOFMONTH()

DAYOFWEEK()

DAYOFYEAR()

DATEDIFF()

EXTRACT()

FLOOR() (see CEILING() and FLOOR(), immediately following this list)

HOUR()

MICROSECOND()

MINUTE()

MOD()

MONTH()

QUARTER()

SECOND()

TIME_TO_SEC()

TO_DAYS()

WEEKDAY()

YEAR()

YEARWEEK()

注意:

因为分区函数不包括FROM_UNIXTIME函数,所以用时间戳转时间来分区就无法实现了,只能用date或者datetime来分区

例如按年我们可以用:

PARTITION BY RANGE (YEAR(date))

按月:

PARTITION BY RANGE(date div 100)

#div 会把日期变成整数,例如:2014-12-01 -> 20141201、100就是从后面去掉两位,最后结果是201412

一个订单做分区的例子:

CREATE TABLE `order` ( `order_id` bigint(19) NOT NULL DEFAULT '0' COMMENT '订单ID:年月日时分秒12位 7位随机数', `date` date NOT NULL DEFAULT '0000-00-00' COMMENT '订单日期', `amount` int(11) DEFAULT NULL COMMENT '支付金额,单位分', `status` tinyint(1) DEFAULT '0' COMMENT '0:等待支付 1:支付成功 2:支付失败 3:验证失败', `addtime` int(10) DEFAULT NULL COMMENT '订单添加时间', PRIMARY KEY (`order_id`,`date`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;

因为我们没法用时间戳来做按时间分区,所以添加了一个date字段,这个字段和order_id一起作为主键,我们知道分区的列一定要放到主键里面去的。下面我们用date计算成年月组合来分区

ALTER TABLE order PARTITION BY RANGE( date DIV 100)( PARTITION p_2014_06 VALUES LESS THAN (201407), PARTITION p_2014_07 VALUES LESS THAN (201408), PARTITION p_2014_08 VALUES LESS THAN (201409), PARTITION p_2014_09 VALUES LESS THAN (201410), PARTITION p_2014_10 VALUES LESS THAN (201411), PARTITION p_catch_all VALUES LESS THAN MAXVALUE);
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表