Mysql - 在DATETIME列上的HASH PARTITION与RANGE PARTITION?

时间:2014-07-02 09:28:19

标签: mysql partitioning

有人可以在DATETIME专栏中告诉我HASH PARITION与RANGE PARTITION的利弊吗? 让我们考虑一下我们有200个记录的POS表,并希望根据交易日期的年份创建分区,如

PARTITION BY HASH(YEAR(TRANSACTION_DATE)) PARTITIONS 4;

PARTITION BY RANGE(YEAR(TRANSACTION_DATE)) (
    PARTITION p0 VALUES LESS THAN (2010),
    PARTITION p1 VALUES LESS THAN (2012),
    PARTITION p2 VALUES LESS THAN (2013),
    PARTITION p4 VALUES LESS THAN MAXVALUE
);

使用TRANSACTION_DATE BETWEEN'2013-03-01'EN'2013-09-29'

提高查询效果

哪一个比另一个好?为什么?

1 个答案:

答案 0 :(得分:3)

存在一些显着差异。如果你有where条款引用一系列年份,例如:

where year(transaction_date) between 2009 and 2011

然后我认为散列分区不会将其识别为只打一个,两个或三个分区。范围分区应该识别这一点,减少这种查询的I / O.

更重要的区别与管理数据有关。使用范围分区,一旦创建了分区 - 并且年份已经过去 - 可能不会再次触及分区。这意味着您只需要备份一个分区,即当前分区。而且,明年,您只需要备份一个分区。

如果您想要离线移动数据,则会出现类似的情况。与逐个删除行相比,删除包含最早年份数据的分区非常容易。

当分区数量只有四个时,这些考虑因素可能没什么区别。关键思想是范围分区将每一行分配给已知分区。散列分区将每一行分配给一个分区,但您不确切知道哪一行。

编辑:

减少分区读取的特定优化称为“分区修剪”。 MySQL很好地记录了here。特别是:

  

对于由HASH或KEY分区的表,分区修剪是   在WHERE子句使用simple =的情况下也是可能的   与分区表达式中使用的列的关系。

对于不等式(甚至in)的分区修剪似乎需要范围分区。