2

私の状況では、新しい Web サイトの範囲またはリストで分割できます。以下は、選択できる両方の例です。

partition BY LIST(`category`)( 
PARTITION p0 VALUES IN(0), 
PARTITION p1 VALUES IN(1), 
PARTITION p2 VALUES IN(2), 
PARTITION p3 VALUES IN(3),
PARTITION p4 VALUES IN(4),
PARTITION p5 VALUES IN(5),
PARTITION p6 VALUES IN(6)
);

または私ができる、

PARTITION BY RANGE (`category`)(
PARTITION p0 VALUES LESS THAN (1),
PARTITION p1 VALUES LESS THAN (2),
PARTITION p2 VALUES LESS THAN (3),
PARTITION p3 VALUES LESS THAN (4),
PARTITION p4 VALUES LESS THAN (5),
PARTITION p5 VALUES LESS THAN (6),
PARTITION p6 VALUES LESS THAN (7)
);

パーティショニングについて何も知らないので、どれを選択するのが良いでしょうか?

また、私はこのようなこともできることを知りました、

partition BY HASH(`category`)
partitions 7;

選択するより良いものはありますか、それとも本当に問題ではありませんか?

最後の質問として、7 つの異なるカテゴリがあります。最後のオプションを選択すると、7 つ以上のパーティションを使用するとどうなりますか? これを行うのはばかげているだけでしょうか、それともパフォーマンスが向上しますか。

私の質問を読んでくれてありがとう!

4

2 に答える 2

2

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 パーティション分割を使用します。

于 2012-09-26T09:02:55.603 に答える
0

分割方法の選択は、テーブルを分割する候補に基づいて行う必要があります。その候補に固定値がある場合 (例: 月)、リスト分割を使用できます。または、範囲が広いですか?候補の値の範囲、次に範囲パーティションに進みます。

于 2012-06-20T09:37:40.407 に答える