系列十三、查询数据库中某个库、表、索引等所占空间的大小

信息架构表:MySQLinformation_schema数据库的关键功能和空间管理
本文介绍了MySQL的information_schema数据库,包括其包含的关键表及其用途,如schemata、tables、columns等,以及如何使用该数据库进行空间占用查询、索引信息获取等实用功能。

一、information_schema数据库

1.1、概述

        information_schema数据库是MySQL出厂默认带的一个数据库,不管我们是在Linux中安装MySQL还是在Windows中安装MySQL,安装好后都会有一个数据库information_schema,这个库中存放了其他库的所有信息。

1.2、关键表

schemata表:这个表里面主要是存储在mysql中的所有的数据库的信息。
tables表:这个表里存储了所有数据库中的表的信息,包括每个表有多少个列等信息。
columns表:这个表存储了所有表中的表字段信息。
statistics表:存储了表中索引的信息。
user_privileges表:存储了用户的权限信息。
schema_privileges表:存储了数据库权限。
table_privileges表:存储了表的权限。
column_privileges表:存储了列的权限信息。
character_sets表:存储了mysql可以用的字符集的信息。
collations表:提供各个字符集的对照信息。
collation_character_set_applicability表:相当于collations表和character_sets表的前两个字段的一个对比,记录了字符集之间的对照信息。
table_constraints表:这个表主要是用于记录表的描述存在约束的表和约束类型。
key_column_usage表:记录具有约束的列。
routines表:记录了存储过程和函数的信息,不包含自定义的过程或函数信息。
views表:记录了视图信息,需要有show view权限。
triggers表:存储了触发器的信息,需要有super权限。

二、常用功能

2.1、查询所有数据库中所有表占据的空间

use information_schema;

select 
	concat(round(sum(data_length/1024/1024),2),'MB') as 'MB', 
	concat(round(sum(data_length/1024/1024/1024),2),'GB') as 'GB'
from tables;

 

2.2、查询指定数据库占据的空间

select 
	concat(round(sum(data_length/1024/1024),2),'MB') as 'MB', 
	concat(round(sum(data_length/1024/1024/1024),2),'GB') as 'GB'
from tables
where table_schema = 'vhr';

2.3、查询指定数据库的指定表占据的空间

select 
	concat(round(sum(data_length/1024),2),'KB') as 'KB', 
	concat(round(sum(data_length/1024/1024),2),'MB') as 'MB', 
	concat(round(sum(data_length/1024/1024/1024),2),'GB') as 'GB'
from tables
where table_schema = 'vhr'
and table_name = 'user';

2.4、查询指定数据库的指定表的索引占据的空间

2.4.1、当前数据库中的表

2.4.2、user表中的索引信息

2.4.3、user表中索引所占空间大小

2.5、参考

https://blog.youkuaiyun.com/u011334621/article/details/53066818

<think> 根据用户需求,需要查询MySQL数据中数据的数据量(记录数)和用磁盘空间大小。结合提供的引用信息,我们可以通过查询`information_schema`数据中的`TABLES`来获取这些信息。 具体步骤如下: 1. 使用`USE information_schema;`切换到`information_schema`数据(可选,也可以直接查询)。 2. 查询`TABLES`,其中`TABLE_SCHEMA`字段示数据名,`TABLE_NAME`名,`TABLE_ROWS`的记录数(数据量),`DATA_LENGTH`示数据长度(字节),`INDEX_LENGTH`索引长度(字节)。总空间为`DATA_LENGTH + INDEX_LENGTH`。 我们可以将字节转换为MB,以便于阅读。 根据引用[4]中的示例,我们可以编写如下查询语句: 查询指定数据中所有的数据量、数据空间索引空间和总空间(以MB为单位): ```sql SELECT TABLE_NAME AS '名', TABLE_ROWS AS '记录数', CONCAT(TRUNCATE(DATA_LENGTH/1024/1024,2),' MB') AS '数据空间', CONCAT(TRUNCATE(INDEX_LENGTH/1024/1024,2),' MB') AS '索引空间', CONCAT(TRUNCATE((DATA_LENGTH+INDEX_LENGTH)/1024/1024,2),' MB') AS '总空间' FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_database_name' ORDER BY TABLE_ROWS DESC, INDEX_LENGTH DESC; ``` 注意:将`your_database_name`替换为你要查询的数据名称。 如果用户需要查看所有数据空间用情况(如引用[2]所示),可以使用: ```sql SELECT TABLE_SCHEMA AS '数据', CONCAT(TRUNCATE(SUM(DATA_LENGTH)/1024/1024,2),' MB') AS '数据大小', CONCAT(TRUNCATE(SUM(INDEX_LENGTH)/1024/1024,2),' MB') AS '索引大小', CONCAT(TRUNCATE(SUM(DATA_LENGTH+INDEX_LENGTH)/1024/1024,2),' MB') AS '总大小' FROM information_schema.TABLES GROUP BY TABLE_SCHEMA ORDER BY SUM(DATA_LENGTH) DESC; ``` 另外,引用[3]中提到可以查看指定数据下所有大小和记录数,我们已经在第一个查询中实现。 关于记录数(`TABLE_ROWS`)的准确性:在InnoDB存储引擎中,这个值是一个近似值,可能不是精确计数。如果需要精确的行数,可以使用`SELECT COUNT(*) FROM table_name`,但请注意对于大这可能比较耗时。 总结:通过查询`information_schema.TABLES`,我们可以获取到数据大小信息以及记录数。用户可以根据需要选择查询整个数据还是特定数据中的。 §§相关问题§§ 1. 如何查看MySQL中某个的具体行数(精确计数)? 2. 为什么`information_schema.TABLES`中`TABLE_ROWS`的行数不精确? 3. 如何清理MySQL数据中的碎片以释放磁盘空间? 4. 如何查看MySQL数据的版本信息? </think>### MySQL查询数据库数据量与磁盘空间大小的方法 在MySQL中,可以通过查询系统数据`information_schema`来获取数据的数据量(记录数)和磁盘空间用情况。以下是具体方法: #### 1. 查看指定数据中所有的数据量及空间用 ```sql SELECT TABLE_NAME AS '名', TABLE_ROWS AS '记录数', CONCAT(ROUND(DATA_LENGTH/(1024*1024),2),' MB') AS '数据空间', CONCAT(ROUND(INDEX_LENGTH/(1024*1024),2),' MB') AS '索引空间', CONCAT(ROUND((DATA_LENGTH+INDEX_LENGTH)/(1024*1024),2),' MB') AS '总空间' FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_database_name' ORDER BY DATA_LENGTH DESC; ``` **说明**: - 替换`your_database_name`为实际数据名 - `TABLE_ROWS`显示数据量(记录数) - `DATA_LENGTH`是数据空间 - `INDEX_LENGTH`是索引空间 - 结果按数据空间降序排列[^3][^4] #### 2. 查看所有数据空间用情况 ```sql SELECT TABLE_SCHEMA AS '数据', CONCAT(ROUND(SUM(DATA_LENGTH)/(1024*1024),2),' MB') AS '数据大小', CONCAT(ROUND(SUM(INDEX_LENGTH)/(1024*1024),2),' MB') AS '索引大小', CONCAT(ROUND(SUM(DATA_LENGTH+INDEX_LENGTH)/(1024*1024),2),' MB') AS '总大小' FROM information_schema.TABLES GROUP BY TABLE_SCHEMA ORDER BY SUM(DATA_LENGTH) DESC; ``` **输出示例**: | 数据 | 数据大小 | 索引大小 | 总大小 | |-------------|----------|----------|---------| | ecommerce | 245.76 MB| 68.32 MB | 314.08 MB| | blog | 120.50 MB| 32.15 MB | 152.65 MB| #### 3. 查看单个的详细空间信息 ```sql SELECT TABLE_NAME AS '名', TABLE_ROWS AS '记录数', CONCAT(ROUND(DATA_LENGTH/1024,2),' KB') AS '数据大小', CONCAT(ROUND(INDEX_LENGTH/1024,2),' KB') AS '索引大小', CONCAT(ROUND(DATA_FREE/1024,2),' KB') AS '碎片空间' FROM information_schema.TABLES WHERE TABLE_NAME = 'your_table_name' AND TABLE_SCHEMA = 'your_database_name'; ``` #### 注意事项: 1. 权限要求:需要`SELECT`权限访问`information_schema`数据 2. 数据量精度:`TABLE_ROWS`对InnoDB是估算值,对MyISAM是精确值 3. 空间计算:包含数据和索引空间,不包括碎片空间 4. 单位换算:`1 MB = 1024*1024 字节` #### 示例查询结果解释 ```sql -- 查询示例 SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'test_db' AND TABLE_NAME = 'orders'; ``` 可能返回: ``` +------------+-------------+------------+------------+ | TABLE_ROWS | DATA_LENGTH | INDEX_LENGTH | DATA_FREE | +------------+------------+--------------+-----------+ | 12050 | 5242880 | 2097152 | 1048576 | +------------+------------+--------------+-----------+ ``` - **记录数**:12,050行 - **数据空间**:5MB(5242880字节) - **索引空间**:2MB(2097152字节) - **碎片空间**:1MB(未使用的碎片空间)[^1][^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值