【发布时间】:2026-01-21 07:40:02
【问题描述】:
我已经对我的表进行了水平分区,我想看看这些行当前是如何分布的。搜索网络没有带来任何相关结果。
谁能告诉我这是否可行?
【问题讨论】:
-
你浏览过信息模式中的分区表吗? INFORMATION_SCHEMA PARTITIONS Table
标签: mysql database database-design database-schema partitioning
我已经对我的表进行了水平分区,我想看看这些行当前是如何分布的。搜索网络没有带来任何相关结果。
谁能告诉我这是否可行?
【问题讨论】:
标签: mysql database database-design database-schema partitioning
您可以使用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。
【讨论】:
只是为了补充 Jason 的答案,根据参考手册,您可以通过以下方式获取有关表上现有分区的信息 -
使用 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
)
使用 Show Table Status - 确定表是否已分区;
语法:show table status in db_name like table_name;
示例输出:显示有关表的大量信息,例如名称、引擎、版本、数据长度等。您会在输出中获得“Create_options”参数的“分区”值。
查询 INFORMATION_SCHEMA.PARTITIONS 表。
(参考 Jason 的回答,您可以选择添加 SUBPARTITION_NAME、SUBPARTITION_ORDINAL_POSITION、SUBPARTITION_METHOD、PARTITION_EXPRESSION 等选择参数以获取更多信息。请参阅 MySQL Ref Manual)
使用语句 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
【讨论】: