有人可以告诉我 DATETIME 列上 HASH PARITION 与 RANGE PARTITION 的优缺点吗?
假设我们有一个包含 2000 万条记录的 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' AND '2013-09-29' 提高查询性能
哪个比另一个更好?为什么?
最佳答案
存在一些显着差异。如果您有一个 where
子句,它指的是一个年份范围,例如:
where year(transaction_date) between 2009 and 2011
那么我认为哈希分区不会将其识别为仅命中一个、两个或三个分区。范围分区应该认识到这一点,从而减少此类查询的 I/O。
更重要的区别与管理数据有关。使用范围分区,一旦创建了一个分区——而且一年过去了——大概不会再次触及该分区。这意味着您只需备份一个分区,即当前分区。而且,明年,您只需要备份一个分区。
如果您想离线移动数据,也会出现类似的情况。与逐行删除行相比,删除包含最早年份数据的分区非常容易。
当分区数只有四个时,这些考虑可能没有太大区别。关键思想是范围分区将每一行分配给一个已知分区。散列分区将每一行分配给一个分区,但您并不确切知道是哪一个。
编辑:
减少分区读取的特定优化称为“分区修剪”。 MySQL 很好地记录了这一点 here 。特别是:
看起来不等式的分区修剪(甚至
in
)需要范围分区。关于Mysql - DATETIME 列上的 HASH PARTITION 与 RANGE PARTITION?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24527488/