22.3.5 获取有关分区的信息
本节讨论获取有关现有分区的信息,这可以通过多种方式来完成。获取此类信息的方法包括:
-
使用显示创建 table语句查看在创建分区 table 中使用的分区子句。
-
使用显示 table 格状态语句确定 table 是否已分区。
-
查询INFORMATION_SCHEMA.PARTITIONStable。
-
使用语句EXPLAIN SELECT查看给定的SELECT使用了哪些分区。
如本章其他地方所讨论的,显示创建 table在其输出中包含用于创建分区 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)
显示 table 格状态对于分区 table 的输出与非分区 table 的输出相同,除了Create_options
列包含字符串partitioned
。 Engine
列包含 table 的所有分区使用的存储引擎的名称。 (有关此语句的更多信息,请参见第 13.7.5.36 节“ SHOW TABLE STATUS 语句”。)
您还可以从INFORMATION_SCHEMA
(其中包含PARTITIONStable)获取有关分区的信息。参见第 24.16 节“ INFORMATION_SCHEMA PARTITIONStable”。
使用EXPLAIN可以确定给定的SELECT查询中涉及分区 table 的哪些分区。 EXPLAIN输出中的partitions
列列出了查询可以从中匹配记录的分区。
假设您创建了一个 tabletrb1
,并按如下所示进行填充:
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
在这种情况下,将搜索所有四个分区。但是,将使用分区键的限制条件添加到查询中时,您可以看到仅扫描了包含匹配值的那些分区,如下所示:
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对未分区的 table 检查查询,则不会产生任何错误,但是partitions
列的值始终为NULL
。
EXPLAIN输出的rows
列显示 table 中的总行数。