MySQL分区:为什么它没有采取适当的分区

时间:2013-09-14 07:19:59

标签: mysql partitioning

          DROP TABLE temp;
          CREATE TABLE `temp` (
         `CallID` bigint(8) unsigned NOT NULL,
         `InfoID` bigint(8) unsigned NOT NULL,
         `CallStartTime` datetime NOT NULL,
         `PartitionID` int(4) unsigned NOT NULL,
         KEY `CallStartTime`(`CallStartTime`)
       ) ENGINE=InnoDB DEFAULT CHARSET=latin1
         PARTITION BY HASH (PartitionID)
          PARTITIONS 366 

我在示例查询中使用EXPLAIN,我得到了下一个结果:

EXPLAIN PARTITIONS SELECT * FROM temp where PartitionID = 1

 EXPLAIN PARTITIONS SELECT * FROM temp where PartitionID = DAYOFYEAR('2013-01-01 10:24:00')

结果:

   id   select_type table   partitions  type    possible_keys   key key_len ref rows    Extra
  1         SIMPLE          temp    p1  ALL                 2   Using where

我不知道它为什么使用p1分区。这里parititon从p0开始

1 个答案:

答案 0 :(得分:1)

HASH分区方案意味着MySQL将您的任意数值转换为自己的哈希值。您已定义了366个分区。如果您的查询是:

,您认为会发生什么?

EXPLAIN PARTITIONS SELECT * FROM temp,其中PartitionID = 400 ?

在这种情况下,您的PartitionID并不意味着真实分区的ID /名称,因为没有分区400.

现在,就在我们两个人之间,您可能有兴趣了解MySQL的HASHing函数是一个简单的模数。因此,0映射到分区p0,1映射到分区p1,400映射到分区34(== 400-366)。

一般来说,您不应对所使用的特定分区的识别过于兴趣。你应该更有兴趣知道分区之间有很好的平衡。

如果天平对您不合适,您可以考虑使用KEY分区方案,其中散列算法基于校验和函数,这意味着与HASH模数分区相比,值更“随机”扩展方案