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开始
答案 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模数分区相比,值更“随机”扩展方案