Spec-Zone.ru › MySQL 8.4

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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/partitioning-info.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API