MySQLシリーズ:10パーティション-パーティションタイプ

ポイントにまっすぐ

         素人の言葉で言えば、パーティショニングとは、テーブル(通常は大きなテーブル)をいくつかの部分に分割することです。一般に、商用データベースはパーティショニングをサポートしています。これは、OSのファイルサイズの制限を破り、大きなクエリを高速化するために使用されます。テーブル。たとえば、Oracleパーティションテーブルは、テーブルのさまざまな部分をさまざまな表スペースに格納できます。同様に、MySQLはデフォルトinnodb_file_per_tableオプションをオンにするため、各テーブルはデータファイル(つまり、テーブルスペース)に対応します。したがって、MySQLパーティションは、テーブルのさまざまな部分をさまざまなデータファイル(テーブルスペース)に格納します。

         MySQLパーティショニングは水平パーティショニングとも呼ばれます。つまり、テーブル行データは水平方向に異なるサブセットに分割され、異なるサブセットの分割はパーティション関数によって異なります。MySQLは、RANGE、LIST、HAS、およびKEYの4つのパーティションタイプをサポートしています。異なるパーティションタイプは、異なるバリアントもサポートします。以下では、これら4つのパーティションについて詳しく説明し、関連するテーブル作成構文の例を示します。

範囲パーティション

         範囲パーティションは、連続した重複しない範囲を使用してテーブルをパーティション化します。シリアル番号1〜1000、1001〜2000、2001〜maxvalueなど。

テーブル構築ステートメント

create table range_par1 (id int(11) not null) partition by range(id) (partition pt1000 values less than (1000) );

 

    上記のSQLステートメントは、IDが1000未満の行をpt1000パーティションに範囲で分割することにより、テーブルrange_par1を作成します。ID 1001のレコードをテーブルに挿入すると、パーティションが見つからないというエラーが報告されます。

バリアント列

         範囲パーティションは、複数の列をパーティション化できる列バリアントをサポートします。といった:

mysql> create table range_col_par1 (id int(11) not null, id2 int(11) not null) partition by range columns(id,id2) (partition pt1000 values less than (1000,1000) );

Query OK, 0 rows affected (0.55 sec)

リストパーティション(ディスクリートタイプ)

         範囲パーティションと同様に、リストも列の範囲によってパーティション化されますが、リストパーティションはそれ自体で範囲を指定する必要があり、これが個別のパーティションになります。

テーブル構築ステートメント

create table list_par1 (id int(11) not null) partition by list(id) (partition p0 values in (1,3));

 

上記のように、id値が1または3のレコードはp0パーティションです。ID 2のレコードを挿入し、パーティションが見つからないというエラーを報告します。

バリアント列

同様に、リストパーティションは、次のように1つ以上の列をパーティション化するために使用できる列バリアントをサポートします。

 

ハッシュパーティション

         上記の範囲およびリストパーティションとは異なり、ハッシュパーティションは、指定された列に対してハッシュ操作を実行することにより、関連する行レコードを各パーティションに均等に分散できます。

テーブル構築ステートメント

create table hash_par1 (id int(3) not null) partition by hash(id) partitions 4;

 

    上記のように、ハッシュパーティションテーブルhash_part1が作成され、ID列がハッシュ変数として使用されて4つのパーティションに分割され、データベースに0〜9行が挿入され、information_schemaメタデータテーブルを介して行の分布が表示されます。 p0 / p1パーティションには3行、p2 / p3パーティションがあることがわかります。パーティションは2行を分散します。

バリアントLINEAR

    HASHパーティションは、線形バリアント、つまり線形ハッシュパーティションをサポートします。通常のハッシュとは異なり、線形ハッシュは線形2乗アルゴリズムを使用してハッシュキーを計算します。2の累乗アルゴリズムに関して、作成者は必要に応じて次のアルゴリズムについて説明し、次のようにライナーハッシュパーティションテーブルステートメントを作成します(hashキーワードの前に線形であると想定)。

 create table hash_linear_par1 (id int(3) not null) partition by linear hash(id) partitions 4;

キーパーティション

         キーパーティションはハッシュパーティションに似ていますが、HASHパーティションは整数のみをサポートし、KEYパーティションはパーティションキーとしてBLOBとTextを除く他のタイプをサポートします。

テーブル構築ステートメント

create table key_par1 (name varchar(11)) partition by key(name) partitions 4;

バリアントLINEAR

    キーパーティションの線形バリアントは、ハッシュパーティションに似ています-ここでは省略されています。

サブパーティション

         RANGEおよびLISTタイプのテーブルは、さらにサブパーティション化できます。サブパーティションは、同様にハッシュまたはキーにすることができます。次のように:

テーブル構築ステートメント

CREATE TABLE sub_test (id INT, id2 INT)
PARTITION BY RANGE( id )
SUBPARTITION BY HASH( id2 )
SUBPARTITIONS 2 (
   PARTITION p0 VALUES LESS THAN (1990),
   PARTITION p1 VALUES LESS THAN (2000),
   PARTITION p2 VALUES LESS THAN MAXVALUE
    );

         上記のように、最初に範囲をidで3つのパーティションに分割し、次にid2列でパーティションを分割し、次にサブハッシュを分割して、テーブル全体が6つのパーティションを形成するようにします。

総括する

         前述のように、MySQLは、範囲、リスト、ハッシュ、キーの4つのパーティションタイプをサポートします。各パーティションタイプは、さまざまなバリアントをサポートします。その中で、範囲パーティションとリストパーティションは、非常に柔軟なサブパーティションもサポートします。

一般的に、パーティション分割の重要性は、テーブルをいくつかの部分に人為的に分割することにあります。これらの部分は、分散テーブルの格納に使用され、大きなテーブルのクエリを高速化します。これは、テーブルレコードが多すぎる場合に非常に役立ちます。上記のテスト・ステートメントが表を作成した後に形成される表スペース・ファイルを以下にリストします。つまり、パーティションごとに1つのファイルです。以降のブログ投稿では、(ディスク障害のリスクを軽減するために)異なるパスで異なるパーティションを指定したり、テーブルパーティションを変更/マージしたりするなど、パーティションテーブルの操作を引き続き分割します。

ありがとうございました。

おすすめ

転載: blog.csdn.net/zhaogang1993/article/details/99232896