暴走漫画起源,你肯定不会是最后一个知道的 2025-11-17 10:29:27
I2C和SPI是两种不同的通信协议SDA SCL ,CS SCK MOSI MISO介绍 2025-11-12 08:35:09
如何在Word中删除不需要的页面?详解步骤与技巧 2025-10-21 05:49:49
战魂传说·2025盛夏跨服争霸赛——觉醒之战魂巅峰对决荣耀盛典 2025-06-03 15:16:38
2025年眼镜生意解决方案 2025-10-24 05:31:52
魔力弹神2025年度全球玩家狂欢盛典:弹神争霸赛 2025-05-26 07:24:56
2025年lol代练价格表一览 2025-10-04 13:19:43
CF国内开服时间官网一览 2025-11-27 23:21:25
iPhone 换电池手册:什么时候换、要多久? 常见问题一次解答 2025-09-26 10:43:27
[诺基亚]电信光猫超级密码逻辑ID配置文件获取方法,求指导 2025-10-26 06:13:21

24.3.5 获取分区信息

24.3.5 获取分区信息

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

使用SHOW CREATE TABLE

语句查看创建分区表时使用的分区子句。

使用该SHOW TABLE STATUS

语句来确定表是否已分区。

查询

INFORMATION_SCHEMA.PARTITIONS

表。

使用语句

EXPLAIN

SELECT查看给定的

SELECT.

从 MySQL 8.0.16 开始,当对分区表进行插入、删除或更新时,二进制日志记录有关分区和(如果有)发生行事件的子分区的信息。为发生在不同分区或子分区中的修改创建一个新的行事件,即使涉及的表是相同的。因此,如果事务涉及三个分区或子分区,则会生成三个行事件。对于更新事件,“之前”映像和“之后”映像的分区信息都被记录下来。-v如果您指定或

,则显示分区信息--verbose使用mysqlbinlog查看二进制日志时的选项。分区信息仅在使用基于行的日志记录时记录 ( 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

/*!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列包含表的所有分区使用的存储引擎的名称。(有关此语句的更多信息,请参阅

第 13.7.7.38 节,“SHOW TABLE STATUS 语句”。)

您还可以从 中获取有关分区的信息

INFORMATION_SCHEMA,其中包含一个

PARTITIONS表。请参阅

第 26.3.21 节,“INFORMATION_SCHEMA PARTITIONS 表”。

SELECT可以使用 确定给定查询

中涉及分区表的哪些分区

EXPLAIN。输出中的

partitions列

EXPLAIN列出了查询将匹配记录的分区。

假设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。

输出列显示表rows中

EXPLAIN的总行数。

另见第 13.8.2 节,“EXPLAIN 语句”。