MySQL 8.4 參考手冊  /  ...  /  取得關於分割區的資訊

26.3.5 取得關於分割區的資訊

本節討論如何取得關於現有分割區的資訊,有多種方式可以做到。取得此類資訊的方法包括下列:

當對分割區表格進行插入、刪除或更新時,二進制日誌會記錄關於發生列事件的分割區和(如果有的話)子分割區的資訊。即使涉及的表格相同,在不同的分割區或子分割區中發生的修改也會建立新的列事件。因此,如果一個事務涉及三個分割區或子分割區,則會產生三個列事件。對於更新事件,會為 之前 影像和 之後 影像記錄分割區資訊。如果您在使用 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 COLLATE=utf8mb4_0900_ai_ci
/*!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 欄包含字串 partitionedEngine 欄包含表格的所有分割區所使用的儲存引擎名稱。(請參閱 第 15.7.7.37 節「SHOW TABLE STATUS 語句」,以取得關於此語句的更多資訊。)

您也可以從 INFORMATION_SCHEMA 取得關於分割區的資訊,其中包含 PARTITIONS 表格。請參閱 第 28.3.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

在此案例中,會搜尋所有四個分割區。但是,當在查詢中新增使用分割區索引鍵的限制條件時,您可以看到只會掃描那些包含相符值的分割區,如下所示

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 欄會顯示表格中的總列數。

另請參閱 第 15.8.2 節「EXPLAIN 語句」