MySQL では、RANGE、LIST、KEY、HASH の 4 つのパーティショニング戦略を使用できます。
パーティション列の特定の値でパーティション化する必要がある場合、RANGE と LIST はこの目的のために設計されています。列の特定の値によって行をファイルに割り当てる必要がない場合は、KEY と HASH が適しています。
あなたの場合、3 つのアプローチ (LIST、RANGE、および HASH) はすべてまったく同じように機能します。7 つのパーティションがあり、`category` = 0 の行は p0 に格納され、`category` = 1 は p1 に格納されるなどです。 .
HASH パーティショニングでは、特定の行を格納するために使用されるファイルを決定するために、MySQL はモジュロ(mod) 操作を使用します。
partition_number = hash(partitioning_column) mod number_of_partitions
HASH の場合、パーティション番号は次のようになります。
partition_number = category mod 7
(ハッシュ関数を使用していないため、デフォルトでIDが使用されます)。
値よりも多い (または少ない) パーティションを作成しても、必ずしも役に立たないわけではありませんが、ID をハッシュ関数として使用している場合は、それ以上のパーティションを作成しても意味がありません。
カテゴリが 7 つしかなく、20 のパーティションを定義するとします。
PARTITION BY HASH(`category`)
PARTITIONS 20;
0 mod 7 = 0、1 mod 7 = 1、2 mod 7 = 2、3 mod 7 = 3、4 mod 7 = 4、5 mod 7 = 5 および 6 mod 7 = 6 として、残りのパーティション (p7- p19) は使用されません。パフォーマンスが向上したり低下したりするのではなく、役に立たないだけです。
ここで、まだ 7 つのカテゴリがあり、パーティションが 4 つしかないとします。
PARTITION BY HASH(`category`)
PARTITIONS 4;
0 mod 4 = 0、1 mod 4 = 1、2 mod 4 = 2、3 mod 4 = 3、4 mod 4 = 0、5 mod 4 = 1、6 mod 4 = 2 .
どうしたの?ファイル p0 には `category` = 0 および `category` = 4 の行が含まれ、p1 には `category` = 1 および `category` = 5 の行が含まれ、p2 には `category` = 2 および `category` の行が含まれます。 ` = 6 で、p3 には `category` = 3 の行のみが含まれます。
これにより、パフォーマンスが向上しますか、それとも低下しますか? これは、このテーブルで実行する SELECT クエリによって異なります。次のようなクエリを実行すると:
SELECT * FROM `table_name` WHERE `category` = 0 or `category` = 4;
1 つのパーティションのみがアクセスされるため、完璧です。しかし、次の例は逆です。
SELECT *
FROM `table_name`
WHERE `category` = 0 OR `category` = 1 OR `category` = 2 OR`category` = 3;
データを取得するには、すべてのパーティションにアクセスする必要があります。
次のように入力すると、MySQL はこの情報を提供します。
EXPLAIN PARTITIONS SELECT_QUERY;
example: EXPLAIN PARTITIONS SELECT * FROM `table_name` WHERE `category` = 0 or `category` = 4;
LIST パーティションと RANGE パーティションは値のリストまたは範囲を指定することを目的としており、パーティションごとに値が 1 つしかないため、どちらを使用するかについては、この場合はHASH パーティション分割を使用します。