MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  パーティションに関する情報を取得する

24.3.5 パーティションに関する情報を取得する

このセクションでは、既存のパーティションに関する情報を取得する方法 (いくつかの方法が可能) について説明します。 そのような情報を取得する方法には次のものが含まれます。

  • SHOW CREATE TABLE ステートメントを使用して、パーティション化されたテーブルの作成に使用されたパーティショニング句を表示する。

  • SHOW TABLE STATUS ステートメントを使用して、テーブルがパーティション化されているかどうかを判別する。

  • INFORMATION_SCHEMA.PARTITIONS テーブルを照会する。

  • ステートメント EXPLAIN SELECT を使用して、特定の SELECT で使用されているパーティションを確認します。

MySQL 8.0.16 から、パーティション化されたテーブルに対して挿入、削除、または更新が行われると、バイナリログには、パーティションに関する情報と、行イベントが発生したサブパーティション (存在する場合) に関する情報が記録されます。 関連するテーブルが同じであっても、別のパーティションまたはサブパーティションで行われる変更に対して新しい行イベントが作成されます。 したがって、トランザクションに 3 つのパーティションまたはサブパーティションが含まれる場合は、3 つの行イベントが生成されます。 更新イベントの場合、ビフォアイメージとアフターイメージの両方のパーティション情報が記録されます。 mysqlbinlog を使用してバイナリログを表示するときに -v または --verbose オプションを指定すると、パーティション情報が表示されます。 パーティション情報は、行ベースのロギングが使用中 (binlog_format=ROW) の場合にのみ記録されます。

この章のほかの場所でも説明しているように、SHOW CREATE TABLE の出力にはパーティション化されたテーブルの作成に使用された PARTITION BY 句が含まれます。 例:

mysql> SHOW CREATE TABLE trb3\G
*************************** 1. row ***************************
       Table: trb3
Create Table: CREATE TABLE `trb3` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `purchased` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
/*!50100 PARTITION BY RANGE (YEAR(purchased))
(PARTITION p0 VALUES LESS THAN (1990) ENGINE = InnoDB,
 PARTITION p1 VALUES LESS THAN (1995) ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN (2000) ENGINE = InnoDB,
 PARTITION p3 VALUES LESS THAN (2005) ENGINE = InnoDB) */
0 row in set (0.00 sec)

パーティション化されたテーブルに対する SHOW TABLE STATUS の出力は、Create_options カラムに文字列 partitioned が含まれることを除いて、パーティション化されていないテーブルの場合と同じです。 Engine カラムには、テーブルのすべてのパーティションによって使用されるストレージエンジンの名前が含まれます。 (このステートメントについての詳細は、セクション13.7.7.38「SHOW TABLE STATUS ステートメント」を参照してください)。

パーティションに関する情報は、PARTITIONS テーブルを含む INFORMATION_SCHEMA からも取得できます。 セクション26.21「INFORMATION_SCHEMA PARTITIONS テーブル」を参照してください。

EXPLAIN を使用して、特定の SELECT クエリーに含まれるパーティションテーブルのパーティションを判別できます。 EXPLAIN 出力の partitions カラムには、クエリーによってレコードが照合されるパーティションがリストされます。

テーブル trb1 が作成され、次のように移入されるとします:

CREATE TABLE trb1 (id INT, name VARCHAR(50), purchased DATE)
    PARTITION BY RANGE(id)
    (
        PARTITION p0 VALUES LESS THAN (3),
        PARTITION p1 VALUES LESS THAN (7),
        PARTITION p2 VALUES LESS THAN (9),
        PARTITION p3 VALUES LESS THAN (11)
    );

INSERT INTO trb1 VALUES
    (1, 'desk organiser', '2003-10-15'),
    (2, 'CD player', '1993-11-05'),
    (3, 'TV set', '1996-03-10'),
    (4, 'bookcase', '1982-01-10'),
    (5, 'exercise bike', '2004-05-09'),
    (6, 'sofa', '1987-06-05'),
    (7, 'popcorn maker', '2001-11-22'),
    (8, 'aquarium', '1992-08-04'),
    (9, 'study desk', '1984-09-16'),
    (10, 'lava lamp', '1998-12-25');

SELECT * FROM trb1; などのクエリーでどのパーティションが使用されるかを次のように確認できます。

mysql> EXPLAIN SELECT * FROM trb1\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: trb1
   partitions: p0,p1,p2,p3
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 10
        Extra: Using filesort

この場合、4 つのパーティションがすべて検索されます。 ただし、次のようにパーティショニングキーを使用する制限条件をクエリーに追加すると、一致する値が含まれているパーティションのみがスキャンされることがわかります。

mysql> EXPLAIN SELECT * FROM trb1 WHERE id < 5\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: trb1
   partitions: p0,p1
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 10
        Extra: Using where

EXPLAIN では、使用されるキーおよび使用可能なキーに関する情報も提供されます:

mysql> ALTER TABLE trb1 ADD PRIMARY KEY (id);
Query OK, 10 rows affected (0.03 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> EXPLAIN SELECT * FROM trb1 WHERE id < 5\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: trb1
   partitions: p0,p1
         type: range
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 4
          ref: NULL
         rows: 7
        Extra: Using where

EXPLAIN を使用して非パーティションテーブルに対するクエリーを調べる場合、エラーは生成されませんが、partitions カラムの値は常に NULL です。

EXPLAIN 出力の rows カラムには、テーブル内の行の合計数が表示されます。

セクション13.8.2「EXPLAIN ステートメント」も参照してください。


関連キーワード:  テーブル, パーティショニング, trb, 情報, PARTITION, EXPLAIN, TABLE, VALUES, InnoDB, LESS