如何查询Mysql数据库的实际大小?

如何查询Mysql数据库的实际大小?,mysql,sql,optimization,Mysql,Sql,Optimization,我有一个很大的sql表,大约30GB,我已经删除了大约一半。因此,信息\u模式没有保存正确的信息(直到数据库优化)。 有没有办法得到实际尺寸?使用InnoDB的全表扫描?,许多数字相当模糊。单行的大小实际上不可用显示表格状态(以及对信息\u模式的等效探测)为您提供了一个估计值。但这一估计可能会有很大偏差——有时甚至超过2倍,高或低 下面是InnoDB表布局的简要概述 数据存储在由16KB块组成的BTree中,按主键排序。(我不会讨论其他btree中的二级索引。) 在这样的结构中插入行可能会在所需

我有一个很大的sql表,大约30GB,我已经删除了大约一半。因此,
信息\u模式
没有保存正确的信息(直到数据库优化)。
有没有办法得到实际尺寸?使用InnoDB的全表扫描?

,许多数字相当模糊。单行的大小实际上不可用<代码>显示表格状态(以及对
信息\u模式
的等效探测)为您提供了一个估计值。但这一估计可能会有很大偏差——有时甚至超过2倍,高或低

下面是InnoDB表布局的简要概述

数据存储在由16KB块组成的BTree中,按
主键排序。(我不会讨论其他btree中的二级索引。)

在这样的结构中插入行可能会在所需的块中找到空间,或者可能需要进行块拆分。删除一行可能会将块的一部分标记为空闲,并且可以(很少)将块返回到“空闲空间”

“avg_row_length”计算为磁盘空间减去“空闲”块,然后除以行数

但这是另一个模糊的数字。通过对BTree进行一些探测,查看每个块有多少行,然后进行一些计算来估计行数

然后,行长度是模糊磁盘空间(不考虑每个块中的空空间)除以模糊行数

我提到了“无数据”。但请注意,插入/删除一行不会更改块的数量,也不会更改无数据

TEXT
列(带有一些警告、限定和例外)存储在单独的块中。其中的分配单元为16KB块。因此,如果您有任何
TEXT
BLOB
列,计算就会变得非常混乱

但我还没说完。。。微小的表分配了几个16KB的块,但当它们变得甚至“小”时,一次就分配8MB的空间。同样,其中一些可以在无数据中看到;很多都不能

“免费”空间分为三类:

  • 在“无数据”中可见,但不释放到操作系统
  • 块中的可重用空间,如发生
    更新
    插入
  • 看不见的头顶。通过计算每一行中每一列的长度,计划一张表的空间是你计算的2-3倍
很抱歉,您遇到了不精确的数字


正在更改主题。。。你为什么要做大删除?如果您有一个滑动时间刻度(想想:新闻),
分区
非常好。如果您要替换所有数据,则会想到一个
重命名表的技巧。

您在寻找什么?磁盘利用率?行数?“自由”空间?您是否查看了
显示表格状态
innodb\u file\u per\u table
的值是多少?查找每行的确切大小之和。换句话说,在运行优化器之后,表的大小基本上是无法预测的。也许最好的预测方法是观察你得到的值并进行插值/外推。是的,现在我知道了。。。谢谢也许我只需要创建一个副本并在那里运行optimize以保持生产运行顺便说一句,我不能进行额外填充,因为我保存了json blob,而且一旦它很大,那么新数据就小得多了基于日期?还是别的什么?如果基于日期,考虑