26.3.5 Получение информации о разделах
В этом разделе рассматривается получение информации о существующих разделах, что можно сделать несколькими способами. К методам получения такой информации относятся:
Использование оператора
SHOW CREATE TABLEдля просмотра клаузов разбиения, используемых при создании разбиеной таблицы.Использование оператора
SHOW TABLE STATUSдля определения, является ли таблица разбиеной.Обращение к таблице схемы информации
PARTITIONS.Использование оператора
EXPLAIN SELECTдля просмотра разделов, используемых заданнымSELECT.
При выполнении операций вставки, удаления или обновления в разбиеной таблице логи записи содержит информацию о разделе и (если есть) о подразделе, в котором произошло событие записи строки. Новое событие записи строки создаётся для модификации, произошедшей в другом разделе или подраздёле, даже если таблица та же. Таким образом, если транзакция затрагивает три раздела или подраздела, генерируются три события записи строки. Для события обновления информация о разделе записывается как для «предыдущей» копии, так и для «последующей» копии. Информация о разделе отображается, если вы указываете опцию -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 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.38, «Оператор SHOW TABLE STATUS»).
Вы также можете получить информацию о разделах из INFORMATION_SCHEMA, которая содержит таблицу PARTITIONS. См. Раздел 28.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 отображает общее количество строк в таблице.
См. также Раздел 15.8.2, «Оператор EXPLAIN».
© 2025 Oracle
Licensed under the GPLv2 License.