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 ?

この場合、パーティション 400 がないため、PartitionID は実際のパーティションの ID/名前を意味することはできません。

ここで、MySQL の HASHing 関数が単純なモジュラスであることを知りたいと思うかもしれません。したがって、0 はパーティション p0 にマップされ、1 はパーティション p1 にマップされ、400 はパーティション 34 (== 400-366) にマップされます。

一般的に言えば、使用されている特定のパーティションの識別にあまり関心を持つべきではありません。パーティションのバランスが取れていることを知っておくと、もっと興味を持つはずです。

バランスが適切でないと思われる場合は、ハッシュ アルゴリズムがチェックサム関数に基づいている KEY パーティショニング スキームの使用を検討してください。これは、HASH モジュラス パーティショニング スキームと比較して、値がより「ランダムに」分散されることを意味します。

于 2013-09-14T12:25:54.633 に答える