Mysql-DATETIME列上的哈希分区与范围分区?

Mysql-DATETIME列上的哈希分区与范围分区?,mysql,partitioning,Mysql,Partitioning,有人能告诉我DATETIME列上哈希分区和范围分区的优缺点吗? 让我们考虑一下,我们有20个MILIN记录的POS表,并且希望根据事务日期的年(如)创建分区。 PARTITION BY HASH(YEAR(TRANSACTION_DATE)) PARTITIONS 4; 或 提高事务处理日期介于“2013-03-01”和“2013-09-29”之间的查询的性能 哪一个比另一个好?为什么呢?有一些显著的差异。如果您有一个where子句,该子句涉及一系列年份,例如: where year(tran

有人能告诉我DATETIME列上哈希分区和范围分区的优缺点吗? 让我们考虑一下,我们有20个MILIN记录的POS表,并且希望根据事务日期的年(如

)创建分区。
PARTITION BY HASH(YEAR(TRANSACTION_DATE)) PARTITIONS 4;

提高事务处理日期介于“2013-03-01”和“2013-09-29”之间的查询的性能


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

有一些显著的差异。如果您有一个
where
子句,该子句涉及一系列年份,例如:

where year(transaction_date) between 2009 and 2011
那么我不认为散列分区会认为它只命中一个、两个或三个分区。范围分区应该认识到这一点,从而减少此类查询的I/O

更重要的区别在于管理数据。对于范围分区,一旦创建了一个分区——一年过去了——可能就不会再碰该分区了。这意味着您只需要备份一个分区,即当前分区。明年,您只需要备份一个分区

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

当分区的数量只有四个时,这些注意事项可能没有多大区别。关键思想是范围分区将每一行分配给一个已知分区。哈希分区将每一行分配给一个分区,但您不知道具体是哪一行

编辑:

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

对于按哈希或键分区的表,分区修剪是必要的 在WHERE子句使用简单= 与分区表达式中使用的列的关系


似乎不平等的分区修剪(甚至是中的)需要范围分区。

我想你应该问一下,使用where子句引用日期范围时,分区on YEAR是否会提高查询的性能?还是应该根据日期范围创建分区?@Murali。我认为您需要范围分区来处理
where
子句中的多个日期或不平等。
where year(transaction_date) between 2009 and 2011