MySQL数据库通过日期创建表分区,日期需要使用日期函数(年月日时分秒)
1.用日期创建分区事例
DROP TABLE IF EXISTS `t_tfm_city_trafficindex`;
CREATE TABLE `t_tfm_city_trafficindex` (
`cityname` varchar(20) DEFAULT '' COMMENT '城市名称',
`time` varchar(10) NOT NULL COMMENT '时间(HH24:mi)',
`type` varchar(20) NOT NULL COMMENT '星期几',
`grade` float(5,2) NOT NULL COMMENT '城市一般交通指数值(0-10)',
`updatetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新时间',
PRIMARY KEY (`time`,`type`,`updatetime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='城市7*24小时一般交通指数'
/*!50100 PARTITION BY RANGE (to_days(updatetime))
(PARTITION partition201607 VALUES LESS THAN (736542) ENGINE = InnoDB,
PARTITION partition201608 VALUES LESS THAN (736573) ENGINE = InnoDB,
PARTITION partition201609 VALUES LESS THAN (736603) ENGINE = InnoDB,
PARTITION partition201610 VALUES LESS THAN (736634) ENGINE = InnoDB,
PARTITION partition201611 VALUES LESS THAN (736664) ENGINE = InnoDB,
PARTITION partition201612 VALUES LESS THAN (736695) ENGINE = InnoDB,
PARTITION partition201701 VALUES LESS THAN (736726) ENGINE = InnoDB,
PARTITION partition201702 VALUES LESS THAN (736754) ENGINE = InnoDB) */;
//其中736542为to_days('2016-08-01'),其他依次顺序排列。。。
2.分区函数
Mysql可用的分区函数
DAY()
DAYOFMONTH()
DAYOFWEEK()
DAYOFYEAR()
DATEDIFF()
EXTRACT()
HOUR()
MICROSECOND()
MINUTE()
MOD()
MONTH()
QUARTER()
SECOND()
TIME_TO_SEC()
TO_DAYS()
WEEKDAY()
YEAR()
YEARWEEK() 等
当然,还有FLOOR(),CEILING() 等,前提是使用这两个分区函数的分区健必须是整型。
要小心使用其中的一些函数,避免犯逻辑性的错误,引起全表扫描。
3.分区类型
Range:基于一个连续区间的列值,把多行分配给分区;
LIST:列值匹配一个离散集合;
Hash:基于用户定义的表达式的返回值选择分区,表达式对要插入表中的列值进行计算。这个函数可以包含SQL中有效的,产生非负整
数值的任何表达式。
KEY:类似于HASH分区,区别在于KEY 分区的表达式可以是一列或多列,且MYSQL提供自身的HASH函数。
4.RANGE分区MAXVALUE值 及加分区测试;
创建表 PRANGE,最后分区一个分区值是MAXVALUE
SELECT
count(*) as total,
user_name,
request_url,
DATE_FORMAT(create_time,'%Y-%m-%d') as days
FROM
s_log_request_time
WHERE
request_url IN (
'/api/operation/publishRules/publishIndex',
'/api/operation/skuListing/index',
'/api/operation/skuListing/detail'
)
group by user_name,request_url,days