此查询打印mydatabase中表的大小(根据数据和索引):
SELECT table_name "Table name",
round(((data_length)/1024/1024),2) "Data size",
round(((index_length)/1024/1024),2) "Index size"
FROM information_schema.TABLES
WHERE table_schema="mydatabase" AND data_length>1000000
order by table_name INTO OUTFILE '/tmp/mydatabase_values'
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
大小以 Mb 为单位打印,并且只考虑大于 1Mb 的表。表格按字母顺序列出,输出保存到 CSV 文件中。
在不同的时间点运行这个查询显示——很明显——随着数据库中数据的变化而产生不同的结果。然而,就在最近几周,查询产生了相同的结果。这是否意味着数据库的大小没有太大变化(如您所见,四舍五入是在 10Kb 边界处完成的)还是我真的遗漏了什么?这个问题听起来可能很荒谬,但是视图中的视图是否INFORMATION_SCHEMA
始终包含最新的元数据?
注意:不,我不是每次都错误地读取同一个 CSV 文件。
编辑:所有表都是 InnoDB,并且innodb_file_per_table=1
.
是的,数据是最新的。但不要过度解读这些数字。
尤其是 InnoDB,会为未来的行预分配空间。因此,很有可能查看表的确切大小,插入几十行(甚至数千行),然后再次查看大小——并看到完全相同的 Data_length 和 Index_length。
当您第一次创建 InnoDB 表并插入一小行时,数据长度将为 16384 字节(一个 16KB 块)。当您添加更多行时,该块最终会溢出,并且会添加另一个块。稍后(当表超过某个阈值时),表将以(我认为)8MB(“范围”)为单位增长。这将允许在不改变磁盘占用空间的情况下添加更多行。
另外,表是用
innodb_file_per_table
ON 还是 OFF 创建的?这控制了这些东西是进入公共ibdata1
文件还是进入表格自己的.ibd
文件。而且,正如@jkavalik 指出的那样,
DELETE
and可能会弄乱尺寸,UPDATE
而且ALTER
不一定以可预测的方式。编辑
这些是“磁盘占用空间”大小。与您在文件系统中看到的内容进行比较。
一个 4 字节的 1 行表
INT
至少需要 16384 字节的磁盘空间。如果你说“4”是真实尺寸,那我就一直在回答错误的问题。我说 16KB 是真正的大小。每列,每行,每个块,BTree结构,每个范围,索引等都有开销。并且InnoDB一次分配不少于16KB。以及“撤消”行副本的空间。因此,“4”变成“16384”。
作为“经验法则”,如果将一行中各列的数据大小(INT 为 4,等等)相加,乘以行数,然后乘以 2 到 3 之间的值,您很可能会得到表的“大小”。(当然,1-col, 1-row 的例子是超过 3x 的 end-case)