MySQL 如何查看每个分区的数据量

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL 如何查看每个分区的数据量

在现代数据库管理中,分区表是一种非常有效的技术,能够显著提升大规模数据的查询和管理性能。在 MySQL 中,了解每个分区的数据量是数据库优化和性能调优的重要环节。本文将详细介绍如何查看 MySQL 中每个分区的数据量。


一、什么是表分区


表分区是将一个表的数据按某种规则分成多个小表存储,以提高查询性能和管理效率。MySQL 支持多种分区类型,包括范围分区(RANGE)、列表分区(LIST)、哈希分区(HASH)和键分区(KEY)。


二、分区表的创建


在开始查看分区数据量之前,我们首先创建一个示例分区表。以下是一个使用 RANGE 分区类型的示例:

CREATE TABLE sales (
    id INT AUTO_INCREMENT PRIMARY KEY,
    sale_date DATE,
    amount DECIMAL(10, 2)
)
PARTITION BY RANGE (YEAR(sale_date)) (
    PARTITION p2019 VALUES LESS THAN (2020),
    PARTITION p2020 VALUES LESS THAN (2021),
    PARTITION p2021 VALUES LESS THAN (2022),
    PARTITION p2022 VALUES LESS THAN (2023)
);


此表根据 sale_date 字段的年份将数据分为四个分区。


三、插入数据


我们向分区表中插入一些数据以便后续查询:

INSERT INTO sales (sale_date, amount) VALUES
('2019-01-15', 100.00),
('2019-05-22', 150.00),
('2020-03-10', 200.00),
('2021-07-18', 250.00),
('2022-12-25', 300.00);


四、查看每个分区的数据量


MySQL 提供了一些系统表和命令,可以用来查看分区表中每个分区的数据量。以下是几个常用的方法:

1. 使用 information_schema.PARTITIONS


information_schema.PARTITIONS 表包含了每个分区的信息,包括行数、数据大小等。以下查询可以获取每个分区的数据量:

SELECT
    PARTITION_NAME,
    TABLE_ROWS
FROM
    information_schema.PARTITIONS
WHERE
    TABLE_SCHEMA = 'your_database_name'
    AND TABLE_NAME = 'sales';


2. 示例:获取每个分区的行数

USE your_database_name;

SELECT
    PARTITION_NAME,
    TABLE_ROWS
FROM
    information_schema.PARTITIONS
WHERE
    TABLE_NAME = 'sales';


输出结果将显示每个分区的名称及其包含的行数:

+----------------+------------+
| PARTITION_NAME | TABLE_ROWS |
+----------------+------------+
| p2019          |          2 |
| p2020          |          1 |
| p2021          |          1 |
| p2022          |          1 |
+----------------+------------+


3. 使用 SHOW TABLE STATUS


SHOW TABLE STATUS 命令也可以提供表的分区信息,包括行数和数据大小等。

SHOW TABLE STATUS LIKE 'sales';


4. 示例:获取表状态信息

SHOW TABLE STATUS LIKE 'sales';


输出结果将显示表的状态信息,但不包含详细的分区信息。


5. 使用 EXPLAIN PARTITIONS


EXPLAIN PARTITIONS 命令可以显示查询中使用了哪些分区。虽然不能直接显示分区的行数,但对调试查询很有帮助。

EXPLAIN PARTITIONS SELECT * FROM sales WHERE sale_date = '2021-07-18';


6. 示例:解释查询计划

EXPLAIN PARTITIONS SELECT * FROM sales WHERE sale_date = '2021-07-18';


输出结果将显示查询使用的分区:

+----+-------------+-------+------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | sales | p2021      | ALL  | NULL          | NULL | NULL    | NULL |    1 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+-------------+


7. 使用 SHOW CREATE TABLE


SHOW CREATE TABLE 命令显示表的创建语句,包含分区信息。

SHOW CREATE TABLE sales;


8. 示例:显示创建表语句

SHOW CREATE TABLE sales;


输出结果将显示表的创建语句:

+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                             |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sales | CREATE TABLE `sales` (
  `id` int NOT NULL AUTO_INCREMENT,
  `sale_date` date DEFAULT NULL,
  `amount` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4
/*!50100 PARTITION BY RANGE (YEAR(sale_date))
(PARTITION p2019 VALUES LESS THAN (2020) ENGINE = InnoDB,
 PARTITION p2020 VALUES LESS THAN (2021) ENGINE = InnoDB,
 PARTITION p2021 VALUES LESS THAN (2022) ENGINE = InnoDB,
 PARTITION p2022 VALUES LESS THAN (2023) ENGINE = InnoDB) */ |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+


9. 使用 ANALYZE TABLE


ANALYZE TABLE 命令可以更新表统计信息,这样 information_schema.PARTITIONS 表中的数据会更加准确。

ANALYZE TABLE sales;


10. 示例:分析表

ANALYZE TABLE sales;


输出结果将显示分析操作的结果:

+-------+---------+----------+----------+
| Table | Op      | Msg_type | Msg_text |
+-------+---------+----------+----------+
| sales | analyze | status   | OK       |
+-------+---------+----------+----------+


小结


通过上述方法和示例,您可以方便地查看 MySQL 中每个分区的数据量,并对分区表进行优化和管理。了解分区的行数和数据量对于数据库的性能调优和问题排查非常有帮助。


五、实际案例分析


案例1:范围分区


假设我们有一个范围分区的订单表 orders,根据订单日期进行分区。以下是创建表和查看分区数据量的示例:

CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    order_date DATE,
    customer_id INT,
    total_amount DECIMAL(10, 2)
)
PARTITION BY RANGE (YEAR(order_date)) (
    PARTITION p2019 VALUES LESS THAN (2020),
    PARTITION p2020 VALUES LESS THAN (2021),
    PARTITION p2021 VALUES LESS THAN (2022),
    PARTITION p2022 VALUES LESS THAN (2023)
);

-- 插入数据
INSERT INTO orders (order_date, customer_id, total_amount) VALUES
('2019-02-15', 1, 100.00),
('2019-11-23', 2, 200.00),
('2020-05-10', 3, 150.00),
('2021-06-18', 4, 300.00),
('2022-08-25', 5, 250.00);

-- 查看分区数据量
SELECT
    PARTITION_NAME,
    TABLE_ROWS
FROM
    information_schema.PARTITIONS
WHERE
    TABLE_NAME = 'orders';


案例2:列表分区


以下是一个使用列表分区的示例,基于地区代码进行分区:

CREATE TABLE regional_sales (
    sale_id INT AUTO_INCREMENT PRIMARY KEY,
    sale_date DATE,
    region_code VARCHAR(5),
    amount DECIMAL(10, 2)
)
PARTITION BY LIST (region_code) (
    PARTITION p_north VALUES IN ('N', 'NE'),
    PARTITION p_south VALUES IN ('S', 'SE'),
    PARTITION p_west VALUES IN ('W', 'NW'),
    PARTITION p_east VALUES IN ('E', 'SW')
);

-- 插入数据
INSERT INTO regional_sales (sale_date, region_code, amount) VALUES
('2021-01-15', 'N', 100.00),
('2021-03-22', 'S', 150.00),
('2021-06-10', 'E', 200.00),
('2021-09-18', 'W', 250.00);

-- 查看分区数据量
SELECT
    PARTITION_NAME,
    TABLE_ROWS
FROM
    information_schema.PARTITIONS
WHERE
    TABLE_NAME = 'regional_sales';


案例3:哈希分区


以下是一个使用哈希分区的示例,基于用户 ID 进行分区:

CREATE TABLE user_activity (
    activity_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    activity_date DATE,
    activity_type VARCHAR(50)
)
PARTITION BY HASH (user_id) PARTITIONS 4;

-- 插入数据
INSERT INTO user_activity (user_id, activity_date, activity_type) VALUES
(1, '2021-01-15', 'login'),
(2, '2021-01-16', 'logout'),
(3, '2021-01-17', 'purchase'),
(4, '2021-01-18', 'review');

-- 查看分区数据量
SELECT
    PARTITION_NAME,
    TABLE_ROWS
FROM
    information_schema.PARTITIONS
WHERE
    TABLE_NAME = 'user_activity';


案例4:键分区


以下是一个使用键分区的示例,基于产品 ID 进行分区:

CREATE TABLE product_inventory (
    inventory_id INT AUTO_INCREMENT PRIMARY KEY,
    product_id INT,
    quantity INT,
    last_update DATE
)
PARTITION BY KEY (product_id) PARTITIONS 4;

-- 插入数据
INSERT INTO product_inventory (product_id, quantity, last_update) VALUES
(1001, 50, '2021-01-01'),
(1002, 20, '2021-01-02'),
(1003, 30, '2021-01-03'),
(1004, 10, '2021-01-04');

-- 查看分区数据量
SELECT
    PARTITION_NAME,
    TABLE_ROWS
FROM
    information_schema.PARTITIONS
WHERE
    TABLE_NAME = 'product_inventory';


案例5:复合分区


以下是一个使用复合分区的示例,首先按年份进行范围分区,然后按月份进行子分区:

CREATE TABLE monthly_sales (
    sale_id INT AUTO_INCREMENT PRIMARY KEY,
    sale_date DATE,
    amount DECIMAL(10, 2)
)
PARTITION BY RANGE (YEAR(sale_date)) SUBPARTITION BY HASH (MONTH(sale_date)) SUBPARTITIONS 12 (
    PARTITION p2019 VALUES LESS THAN (2020),
    PARTITION p2020 VALUES LESS THAN (2021),
    PARTITION p2021 VALUES LESS THAN (2022),
    PARTITION p2022 VALUES LESS THAN (2023)
);

-- 插入数据
INSERT INTO monthly_sales (sale_date, amount) VALUES
('2019-01-15', 100.00),
('2020-03-22', 150.00),
('2021-06-10', 200.00),
('2022-08-18', 250.00);

-- 查看分区数据量
SELECT
    PARTITION_NAME,
    SUBPARTITION_NAME,
    TABLE_ROWS
FROM
    information_schema.PARTITIONS
WHERE
    TABLE_NAME = 'monthly_sales';


六、结论


在 MySQL 中,了解和管理每个分区的数据量是优化数据库性能的重要步骤。通过使用 information_schema.PARTITIONS 表和其他系统命令,可以方便地获取分区的行数和其他统计信息。本文提供了多个示例,展示了如何创建分区表、插入数据以及查询每个分区的数据量。


通过合理的分区策略和有效的管理方法,可以显著提升数据库的查询性能和管理效率。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
关系型数据库 MySQL 数据库
|
15天前
|
SQL 监控 关系型数据库
MySQL如何查看每个分区的数据量
通过本文的介绍,您可以使用MySQL的 `INFORMATION_SCHEMA`查询每个分区的数据量。了解分区数据量对数据库优化和管理具有重要意义,可以帮助您优化查询性能、平衡数据负载和监控数据库健康状况。希望本文对您在MySQL分区管理和性能优化方面有所帮助。
31 1
|
29天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万数据量的优化实录
【10月更文挑战第6天】 在现代互联网应用中,随着用户量的增加和业务逻辑的复杂化,数据量级迅速增长,这对后端数据库系统提出了严峻的挑战。尤其是当数据量达到百万级别时,传统的数据库解决方案往往会遇到性能瓶颈。本文将分享一次使用MySQL与Redis协同优化大规模数据统计的实战经验。
109 3
|
2月前
|
NoSQL 关系型数据库 MySQL
当Redis与MySQL数据一致性校验中Redis数据量小于MySQL时的全量查询处理方法
保持Redis和MySQL之间的数据一致性是一个需要细致规划和持续维护的过程。通过全量数据同步、建立增量更新机制,以及定期执行数据一致性校验,可以有效地管理和维护两者之间的数据一致性。此外,利用现代化的数据同步工具可以进一步提高效率和可靠性。
57 6
|
4月前
|
关系型数据库 MySQL 数据库
|
4月前
|
DataWorks 安全 关系型数据库
DataWorks产品使用合集之如何实现MySQL数据库的自动分区
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
5月前
|
分布式计算 大数据 关系型数据库
MaxCompute产品使用问题之如何查看数据离线同步每天从MySQL抽取的数据量
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
5月前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之当需要将数据从ODPS同步到RDS,且ODPS表是二级分区表时,如何同步所有二级分区的数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
59 7
|
5月前
|
存储 缓存 关系型数据库
心得经验总结:理解MySQL——并行数据库与分区(Partion)
心得经验总结:理解MySQL——并行数据库与分区(Partion)
39 0
|
6月前
|
DataWorks Shell 对象存储
DataWorks产品使用合集之在 DataWorks 中,有一个 MySQL 数据表,数据量非常大且数据会不断更新将这些数据同步到 DataWorks如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
89 3