• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 获取有关分区的信息

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

    • 使用该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列包含表的所有分区使用的存储引擎的名称。(有关此语句的更多信息,请参见“ SHOW TABLE STATUS语句”。)

    您还可以从中获取有关分区的信息INFORMATION_SCHEMA,其中包含一个PARTITIONS表。请参见“ INFORMATION_SCHEMA分区表”。

    使用可以确定给定SELECT查询中涉及分区表的哪些分区EXPLAIN。该partitionsEXPLAIN输出列出了哪些记录将被查询匹配的分区。

    假设一个表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的输出显示表中的行的总数。

    另请参见“ EXPLAIN语句”。

    上篇:分区维护

    下篇:分区修剪