如何按列值“user_id”和“gps_time”对mysql进行分区?

时间:2014-08-30 02:41:07

标签: mysql partition

我的餐桌计划:

CREATE TABLE `test_table` (
  `his_id` int(11) NOT NULL,
  `user_id` varchar(45) NOT NULL,
  `gps_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`his_id`,`user_id`)
)

我想通过 user_id gps_time 对此表进行分区, 哪个列 user_id 被第一个字符A~Z,a~z,0~9分区, 列 gps_time 按标准划分为3个月(即:3个分区)。

怎么做? 非常感谢〜

1 个答案:

答案 0 :(得分:0)

使用MySQL 5.5,您可以使用RANGE分区的多个列。

从你的问题来看,你想要多少个分区并不完全清楚;听起来好像你想要一大堆分区,但我不相信你真正想要的东西。

RANGE分区的语法在MySQL参考手册中,可在线获取。

此处:http://dev.mysql.com/doc/refman/5.5/en/partitioning.html

(请务必查看手册中的实际运行的MySQL版本; 5.0,5.1,5.5等分区的一些重大更改

使用MySQL 5.5.x,如果你想为user_id的第一个字符和一系列gps_time值分别设置一个分区,你可以这样做:

PARTITION BY RANGE COLUMNS(userid, gps_time) 
( PARTITION pA0 VALUES LESS THAN ('B','2014-07-01')
, PARTITION pA1 VALUES LESS THAN ('B','2014-08-01')
, PARTITION pA2 VALUES LESS THAN ('B','2014-09-01')
, PARTITION pA3 VALUES LESS THAN ('B',MAXVALUE)

, PARTITION pB0 VALUES LESS THAN ('C','2014-07-01')
, PARTITION pB1 VALUES LESS THAN ('C','2014-08-01')
, PARTITION pB2 VALUES LESS THAN ('C','2014-09-01')
, PARTITION pB3 VALUES LESS THAN ('C',MAXVALUE)

, ...

, PARTITION pMX VALUES LESS THAN (MAXVALUE,MAXVALUE),

但那超过100个分区。我无法想象你真正想要的那种场景。 (我不确定表的分区上限是多少。)


使用MySQL 5.1,我不相信可以在多列上进行分区。你可以,只需在user_id列上进行分区,然后在gps_time列上创建子分区(在每个分区内)......但我以前从未这样做过。