Mysql分区:如何处理月份和哈希

时间:2010-09-27 02:13:33

标签: mysql hash partitioning

我有一个关于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';

注意:我只有测试数据,因此我可以轻松修改日期字段或分区。

如何使用哈希或密钥按月分区,也使用间隔?

感谢您阅读:)

0 个答案:

没有答案