このセクションでは、存在するパーティションの情報を取得するいくつかの方法を紹介します。これらは:
SHOW CREATE TABLE
ステートメントを使用して、パーティショニングされたテーブルの作成に使用されたPARTITION句を一覧する。
SHOW TABLE STATUS
ステートメントを使用して、テーブルがパーティショニングされているかを判定する。
INFORMATION_SCHEMA.PARTITIONS
をクエリする。
EXPLAIN PARTITIONS SELECT
ステートメントを使用して、どのパーティションが
SELECT
で使用されているか判別する。
この章で別途紹介されているように、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=MyISAM DEFAULT CHARSET=latin1
PARTITION BY RANGE (YEAR(purchased)) (
PARTITION p0 VALUES LESS THAN (1990) ENGINE = MyISAM,
PARTITION p1 VALUES LESS THAN (1995) ENGINE = MyISAM,
PARTITION p2 VALUES LESS THAN (2000) ENGINE = MyISAM,
PARTITION p3 VALUES LESS THAN (2005) ENGINE = MyISAM
)
1 row in set (0.00 sec)
注:MySQL
5.1の最初のリリースでは、PARTITIONS
節は、HASH
や KEY
によってパーティショニングされたテーブルでは表示されませんでした。この問題は
MySQL 5.1.6. で修正されました。
SHOW TABLE STATUS
はパーティショニングされたテーブルにおいても動作します。MySQL
5.1.9に始まり、パーティショニングされていないテーブルと出力は同じですが、Create_options
カラムに partitioned
文字列を含んでいます。MySQL 5.1.8
以前では、Engine
カラムには必ず
PARTITION
の値が含まれていました。MySQL 5.1.9
に始まり、このカラムはテーブルに使用される全てのパーティションのストレージエンジンの名前を含んでいます。(このコマンドの詳細については、項12.5.4.27. 「SHOW TABLE STATUS
構文」
を参照してください。)
パーティションの情報は PARTITIONS
テーブルが含まれる、INFORMATION_SCHEMA
からも取得できます。項21.19. 「INFORMATION_SCHEMA PARTITIONS
テーブル」
を参照してください。
MySQL 5.1.5 に始まり、EXPLAIN PARTITIONS
を使用して、パーティショニングされたテーブルのどのパーティションが
SELECT
と関係しているかを判定することができます。PARTITIONS
キーワードはクエリと照合されるれレコードを記したパーティションを表示する、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 PARTITIONS 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 PARTITIONS 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 PARTITIONS
は標準的な
EXPLAIN SELECT
ステートメントのように、キーや可能性のあるキーに関する情報を提供します。
mysql>ALTER TABLE trb1 ADD PRIMARY KEY (id);
Query OK, 10 rows affected (0.03 sec) Records: 10 Duplicates: 0 Warnings: 0 mysql>EXPLAIN PARTITIONS 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
の制限や規制について注意してください。
EXTENDED
と
PARTITIONS
キーワードを、同じ
EXPLAIN ... SELECT
ステートメントで使用することはできません。これを試みると、構文エラーが発生します。
もし EXPLAIN PARTITIONS
がパーティショニングされていないテーブルに対するクエリを診断する場合、エラーは発生しませんが、partitions
カラムの値は常に NULL
となります。
項6.2.1. 「EXPLAIN
を使用して、クエリを最適化する」 も参照してください。