26.3.5 获取分区信息
本节讨论获取现有分区信息的方法,这些方法包括以下几种:
-
使用
SHOW CREATE TABLE
语句来查看创建分区表时使用的分区子句。 -
使用
SHOW TABLE STATUS
语句来确定表是否分区。 -
查询信息_schema
PARTITIONS
表。 -
使用
EXPLAIN SELECT
语句来查看某个SELECT
语句使用的分区。
当对分区表进行插入、删除或更新操作时,二进制日志记录关于分区和(如果存在)子分区的信息。对于在不同分区或子分区进行的修改,生成新的行事件,即使表相同。对于更新事件,记录了“before”和“after”图像的分区信息。使用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列包含了所有分区表的存储引擎名称。(见Section 15.7.7.37, “SHOW TABLE STATUS Statement”,了解更多关于该语句的信息。)
您也可以从 INFORMATION_SCHEMA
中的 PARTITIONS
表中获取分区信息。请参阅 第28.3.21节,“INFORMATION_SCHEMA PARTITIONS 表”。
可以使用 SELECT
语句中的 EXPLAIN
来确定一个分区表中的哪些分区参与了一个查询。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
列显示了表中的总行数。