有人可以告诉我 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/

10-11 09:20