本節討論如何取得關於現有分割區的資訊,可以透過多種方式進行。取得此類資訊的方法包括以下幾種:
使用
SHOW CREATE TABLE
陳述式來檢視建立分割區表格時使用的分割區子句。使用
SHOW TABLE STATUS
陳述式來判斷表格是否已分割區。查詢資訊綱要
PARTITIONS
表格。使用
EXPLAIN SELECT
陳述式來查看給定的SELECT
使用了哪些分割區。
當對已分割區的表格進行插入、刪除或更新時,二進位日誌會記錄關於列事件發生的分割區以及(如果有的話)子分割區的資訊。即使涉及的表格相同,也會為在不同分割區或子分割區中發生的修改建立新的列事件。因此,如果一個交易涉及三個分割區或子分割區,則會產生三個列事件。對於更新事件,分割區資訊會記錄在「「之前」」映像和「「之後」」映像中。如果您在使用 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
欄包含字串 partitioned
。Engine
欄包含表格所有分割區使用的儲存引擎名稱。(如需關於此陳述式的更多資訊,請參閱第 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
欄會顯示表格中的總列數。