Spec-Zone.ru › MySQL 9.2

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.22 «Таблица 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-9.2-en/partitioning-info.html

Spec-Zone.ru

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