2
          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 开头

4

1 回答 1

1

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

EXPLAIN PARTITIONS SELECT * FROM temp where PartitionID = 400 ?

在这种情况下,您的 PartitionID 不能表示真实分区的 ID/名称,因为没有分区 400。

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

一般来说,您不应该对正在使用的特定分区的标识太感兴趣。您应该更有兴趣知道分区之间存在良好的平衡。

如果平衡对您来说似乎不正确,您可以考虑使用 KEY 分区方案,其中哈希算法基于校验和函数,这意味着与 HASH 模数分区方案相比,值更“随机”分布。

于 2013-09-14T12:25:54.633 回答