【问题标题】:How to see table partition size in MySQL ( is it even possible? )如何在 MySQL 中查看表分区大小(甚至可能吗?)
【发布时间】:2026-01-21 07:40:02
【问题描述】:

我已经对我的表进行了水平分区,我想看看这些行当前是如何分布的。搜索网络没有带来任何相关结果。

谁能告诉我这是否可行?

【问题讨论】:

标签: mysql database database-design database-schema partitioning


【解决方案1】:

您可以使用information_schema 获取每个分区的行。

这是我的示例测试。

mysql> SELECT PARTITION_ORDINAL_POSITION, TABLE_ROWS, PARTITION_METHOD
       FROM information_schema.PARTITIONS 
       WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'tbl_name';
+----------------------------+------------+------------------+
| PARTITION_ORDINAL_POSITION | TABLE_ROWS | PARTITION_METHOD |
+----------------------------+------------+------------------+
|                          1 |          2 | HASH             |
|                          2 |          3 | HASH             |
+----------------------------+------------+------------------+

mysql> SHOW CREATE TABLE tbl_name\G
*************************** 1. row ***************************
       Table: p
Create Table: CREATE TABLE `tbl_name` (
  `a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY HASH (a)
PARTITIONS 2 */
1 row in set (0.00 sec)


mysql> SELECT * FROM tbl_name;
+------+
| a    |
+------+
|    2 |
|    4 |
|    1 |
|    3 |
|    5 |
+------+
5 rows in set (0.00 sec)

更新

来自MySQL Manual

对于已分区的 InnoDB 表,TABLE_ROWS 列中给出的行数只是 SQL 优化中使用的估计值,可能并不总是准确的。

感谢@Constantine。

【讨论】:

  • 请注意:“对于已分区的 InnoDB 表,在 TABLE_ROWS 列中给出的行数只是 SQL 优化中使用的估计值,可能并不总是准确的。”
【解决方案2】:

只是为了补充 Jason 的答案,根据参考手册,您可以通过以下方式获取有关表上现有分区的信息 -

  1. 使用 Show Create Table - 查看用于创建分区表的分区子句; 语法
    show create table table_name;
    样本输出
    CREATE TABLE 'trb3' ( 'id' int(11) default NULL, 'name' varchar(50) default NULL, 'purchased' date default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY RANGE (YEAR(purchased)) ( PARTITION p0 VALUES LESS THAN (1990) ENGINE = MyISAM, PARTITION p1 VALUES LESS THAN (1995) ENGINE = MyISAM, PARTITION p2 VALUES LESS THAN (2000) ENGINE = MyISAM, PARTITION p3 VALUES LESS THAN (2005) ENGINE = MyISAM )

  2. 使用 Show Table Status - 确定表是否已分区;
    语法:
    show table status in db_name like table_name;
    示例输出:显示有关表的大量信息,例如名称、引擎、版本、数据长度等。您会在输出中获得“Create_options”参数的“分区”值。

    李>
  3. 查询 INFORMATION_SCHEMA.PARTITIONS 表。
    (参考 Jason 的回答,您可以选择添加 SUBPARTITION_NAME、SUBPARTITION_ORDINAL_POSITION、SUBPARTITION_METHOD、PARTITION_EXPRESSION 等选择参数以获取更多信息。请参阅 MySQL Ref Manual

    /li>
  4. 使用语句 EXPLAIN PARTITIONS SELECT - 查看给定 SELECT 使用了哪些分区
    语法:
    EXPLAIN PARTITIONS SELECT * FROM trb1
    示例输出:
    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 Ref Manual

【讨论】: