有人可以在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'
提高查询效果哪一个比另一个好?为什么?
答案 0 :(得分:3)
存在一些显着差异。如果你有where
条款引用一系列年份,例如:
where year(transaction_date) between 2009 and 2011
然后我认为散列分区不会将其识别为只打一个,两个或三个分区。范围分区应该识别这一点,减少这种查询的I / O.
更重要的区别与管理数据有关。使用范围分区,一旦创建了分区 - 并且年份已经过去 - 可能不会再次触及分区。这意味着您只需要备份一个分区,即当前分区。而且,明年,您只需要备份一个分区。
如果您想要离线移动数据,则会出现类似的情况。与逐个删除行相比,删除包含最早年份数据的分区非常容易。
当分区数量只有四个时,这些考虑因素可能没什么区别。关键思想是范围分区将每一行分配给已知分区。散列分区将每一行分配给一个分区,但您不确切知道哪一行。
编辑:
减少分区读取的特定优化称为“分区修剪”。 MySQL很好地记录了here。特别是:
对于由HASH或KEY分区的表,分区修剪是 在WHERE子句使用simple =的情况下也是可能的 与分区表达式中使用的列的关系。
对于不等式(甚至in
)的分区修剪似乎需要范围分区。