MySQL 8.0 参考手册  / 第24章分区  / 24.3 分区管理  /  22.3.5 获取分区信息

22.3.5 获取分区信息

本节讨论获取有关现有分区的信息,这可以通过多种方式完成。获取此类信息的方法包括:

正如本章其他地方所讨论的, SHOW CREATE TABLE在其输出中包含PARTITION BY用于创建分区表的子句。例如:

Press CTRL+C to copy
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)

分区表的输出与SHOW TABLE STATUS 非分区表的输出相同,只是该Create_options列包含字符串partitioned。该 Engine列包含表的所有分区使用的存储引擎的名称。(有关此语句的更多信息,请参阅 第 13.7.5.36 节,“SHOW TABLE STATUS 语句”。)

您还可以从 中获取有关分区的信息 INFORMATION_SCHEMA,其中包含一个 PARTITIONS表。请参阅 第 24.3.16 节,“INFORMATION_SCHEMA PARTITIONS 表”

SELECT可以使用 确定给定查询 中涉及分区表的哪些分区 EXPLAIN。输出中的 partitionsEXPLAIN列出了查询将匹配记录的分区。

假设您trb1创建并填充了一个表,如下所示:

Press CTRL+C to copy
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;,如下所示:

Press CTRL+C to copy
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

在这种情况下,将搜索所有四个分区。但是,当将使用分区键的限制条件添加到查询时,您可以看到仅扫描那些包含匹配值的分区,如下所示:

Press CTRL+C to copy
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 还提供有关使用的密钥和可能的密钥的信息:

Press CTRL+C to copy
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用于检查针对非分区表的查询,则不会产生错误,但 partitions列的值始终为 NULL

输出列显示表rowsEXPLAIN的总行数。

另见第 13.8.2 节,“EXPLAIN 语句”