MySQL ·查看数据库表详情

2022-12-01 15:05:47 浏览数 (1)

MySQL 查看数据库表详情

查看所有数据库容量大小

代码语言:javascript复制
select
table_schema as '数据库',
sum(table_rows) as '记录数',
sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'
from information_schema.tables
group by table_schema
order by sum(data_length) desc, sum(index_length) desc;

数据库

记录数

数据容量(MB)

索引容量(MB)

mysql

141892

7.36

0.17

tool_center

9288

1.56

0.01

liveservice-dev

605

0.30

0.04

information_schema

0.10

0.00

domain_center

0

0.07

0.02

moechat

2

0.06

0.00

yuko

0

0.06

0.00

account_center

21

0.04

0.00

storage_center

9

0.03

0.00

sys

6

0.01

0.00

performance_schema

1331048

0.00

0.00

查看指定数据库容量大小

代码语言:javascript复制
select
table_schema as '数据库',
sum(table_rows) as '记录数',
sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'
from information_schema.tables
where table_schema='liveservice-dev';

数据库

记录数

数据容量(MB)

索引容量(MB)

liveservice-dev

605

0.30

0.04

查看指定数据库各表容量大小

代码语言:javascript复制
select
table_schema as '数据库',
table_name as '表名',
table_rows as '记录数',
truncate(data_length/1024/1024, 2) as '数据容量(MB)',
truncate(index_length/1024/1024, 2) as '索引容量(MB)'
from information_schema.tables
where table_schema='liveservice-dev'
order by data_length desc, index_length desc;

数据库

表名

记录数

数据容量(MB)

索引容量(MB)

liveservice-dev

chat_msg

281

0.06

0.00

liveservice-dev

account

6

0.01

0.03

liveservice-dev

firewall

3

0.01

0.01

liveservice-dev

orders

51

0.01

0.00

liveservice-dev

iptables

0

0.01

0.00

liveservice-dev

users_group

2

0.01

0.00

liveservice-dev

users_black

0

0.01

0.00

数据表优化

在 mysql 中,使用 delete 命令删除数据后,会发现这张表的数据文件和索引文件却奇怪的没有变小。这是因为 delete 操作并不会真的把数据删除,mysql 实际上只是给删除的数据打了个标记,标记为删除,因此你使用 delete 删除表中的数据,表文件在磁盘上所占空间不会变小,我们这里暂且称之为假删除。

假删除会留下许多的数据空洞,这些空洞会占据原来数据的空间,所以文件的大小没有改变。这些空洞在以后插入数据的时候可能会被再度利用起来,当然也有可能一直存在。这种空洞不仅额外增加了存储代价,同时也因为数据碎片化降低了表的扫描效率。

使用场景:当一个数据表在经过大量频繁的增删改之后,难免会产生数据空洞,浪费空间并影响查询效率,通常在生产环境中会直接表现为原本很快的查询会变得越来越慢。对于这种情况,可以使用以下命令来重新利用未使用的空间,解决数据空洞问题。

代码语言:javascript复制
-- 命令一
optimize table t

-- 命令二(推荐)
alter table t engine=InnoDB

optimize table 原理是重建表,就是建立一个临时表 B,然后把表 A(存在数据空洞的表)中的所有数据查询出来,接着把数据全部重新插入到临时表 B 中,最后再用临时表 B 替换表 A 即可,这就是重建表的过程。

optimize table 只对 MyISAM,BDB 和 InnoDB 表起作用。对于 BDB 表,optimize table 目前被映射到 analyze table 上。对于 InnoDB 表,optimize table 被映射到 alter table 上,这会重建表。重建操作能更新索引统计数据并释放成簇索引中的未使用的空间。注意:在 optimize table 运行过程中,MySQL 会锁定表,所以要在空闲时段执行。

对于 MyISAM 可以直接使用 optimize table t,当是 InnoDB 引擎时,会报 Table does not support optimize, doing recreate analyze instead,一般情况下,由 myisam 转成 innodb,会用 alter table t engine='innodb' 进行转换,优化也可以用这个。所以当是 InnoDB 引擎时我们就用 alter table t engine='innodb' 来代替 optimize 做优化就可以。

查看前后效果可以使用 show table status 命令,返回结果中的 data_free 即为空洞所占据的存储空间。

代码语言:javascript复制
show table status from `liveservice-dev` like 'chat_msg';

Name

Engine

Version

Row_format

Rows

Avg_row_length

Data_length

Max_data_length

Index_length

Data_free

Auto_increment

Create_time

Update_time

Check_time

Collation

Checksum

Create_options

Comment

problem

InnoDB

10

Dynamic

4

4096

16384

0

0

0

9

2020-12-01 06:49:52

2020-12-01 07:31:16

utf8_general_ci

0 人点赞