### 24.3.5 获取有关分区的信息

[](<>)[](<>)[](<>)[](<>)

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

-   使用[`显示创建表`](show-create-table.html)语句来查看创建分区表时使用的分区子句。

-   使用[`显示表状态`](show-table-status.html)语句来确定表是否已分区。

-   查询[`INFORMATION_SCHEMA.PARTITIONS`](information-schema-partitions-table.html)桌子。

-   使用语句[`解释选择`](explain.html)查看给定的分区使用了哪些分区[`选择`](select.html).

    从 MySQL 8.0.16 开始，当对分区表进行插入、删除或更新时，二进制日志会记录有关分区和（如果有）发生行事件的子分区的信息。即使涉及的表相同，也会为发生在不同分区或子分区中的修改创建新行事件。因此，如果一个事务涉及三个分区或子分区，则会生成三个行事件。对于更新事件，记录“之前”映像和“之后”映像的分区信息。如果您指定`-v`要么`--详细`使用查看二进制日志时的选项[**mysqlbinlog**](mysqlbinlog.html).只有在使用基于行的日志记录时才会记录分区信息（[`binlog_format=行`](replication-options-binary-log.html#sysvar_binlog_format)）。

    正如本章其他地方所讨论的，[`显示创建表`](show-create-table.html)在其输出中包括`分区方式`用于创建分区表的子句。例如：


```
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.html)分区表与非分区表相同，除了`创建选项`列包含字符串`分区的`.这`引擎`列包含表的所有分区使用的存储引擎的名称。（看[第 13.7.7.38 节，“SHOW TABLE STATUS 语句”](show-table-status.html)，有关此声明的更多信息。）

您还可以从以下位置获取有关分区的信息`INFORMATION_SCHEMA`，其中包含一个[`分区`](information-schema-partitions-table.html)桌子。看[第 26.3.21 节，“信息\_SCHEMA 分区表”](information-schema-partitions-table.html).

[](<>)[](<>)

可以确定分区表的哪些分区参与给定[`选择`](select.html)查询使用[`解释`](explain.html).这`分区`列中的[`解释`](explain.html)输出列出查询将匹配记录的分区。

假设一个表`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');
```

您可以查看查询中使用了哪些分区，例如`选择 * 从 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.html)还提供有关使用的密钥和可能的密钥的信息：

```
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.html)用于检查针对非分区表的查询，不会产生错误，但`分区`列总是`空值`.

这`行`列[`解释`](explain.html)输出显示表中的总行数。

也可以看看[第 13.8.2 节，“解释声明”](explain.html).
