我有一个关于mysql 在日期/日期时间列上使用哈希进行子分区的特定问题。 我已经通过site_id进行了分区,现在我希望按月(1到12)进行子分区,因此分区号在时间上是固定的(sp_dec,sp_jan,...)
当前剪切(列和其他分区)表结构:
CREATE TABLE IF NOT EXISTS `email` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`sent_date` datetime NOT NULL,
`site_id` tinyint(4) NOT NULL,
PRIMARY KEY (`id`,`site_id`,`sent_date`),
) ENGINE=InnoDB DEFAULT CHARSET=latin1
PARTITION BY LIST (site_id)
SUBPARTITION BY HASH (MONTH(sent_date)) (
PARTITION p0 VALUES IN (1,3,4) (
SUBPARTITION dec0 ENGINE = InnoDB,
SUBPARTITION jan0 ENGINE = InnoDB,
SUBPARTITION feb0 ENGINE = InnoDB,
SUBPARTITION mar0 ENGINE = InnoDB,
SUBPARTITION apr0 ENGINE = InnoDB,
SUBPARTITION may0 ENGINE = InnoDB,
SUBPARTITION jun0 ENGINE = InnoDB,
SUBPARTITION jul0 ENGINE = InnoDB,
SUBPARTITION aug0 ENGINE = InnoDB,
SUBPARTITION sep0 ENGINE = InnoDB,
SUBPARTITION oct0 ENGINE = InnoDB,
SUBPARTITION nov0 ENGINE = InnoDB)
);
我已经看到我不应该使用MONTH功能进行修剪。 大多数示例使用Range来管理月份问题,但它在子分区中不可用...
首先,我没有使用datetime,因为my_date ='2010-09-27'因为时间部分而失败,所以我需要使用之间或> =提示。 通过这样做,不再应用修剪,因此使用了所有分区!
其次,我将日期时间分成两列,现在,my_date ='2010-09-27'工作正常。 但是,间隔问题仍然存在,不要使用我的分区。
EXPLAIN PARTITIONS SELECT * FROM `email` WHERE sent_date >='2010-09-27'
AND sent_date<'2010-09-28';
EXPLAIN PARTITIONS SELECT * FROM `email` WHERE
sent_date BETWEEN '2010-09-20' AND '2010-09-27';
注意:我只有测试数据,因此我可以轻松修改日期字段或分区。
如何使用哈希或密钥按月分区,也使用间隔?
感谢您阅读:)