【发布时间】:2020-05-18 06:06:06
【问题描述】:
1.我们用这个sql检查mysql的大对象信息,
SELECT TABLE_SCHEMA,
TABLE_NAME,
CONCAT(ROUND(DATA_LENGTH/1024/1024),'MB') AS DATA_LENGTH,
CONCAT(ROUND(INDEX_LENGTH/1024/1024),'MB') AS INDEX_LENGTH,
CONCAT(ROUND(SUM(DATA_LENGTH+INDEX_LENGTH)/1024/1024),'MB') AS TOTDB_SIZE,
TABLE_ROWS
FROM information_schema.TABLES
where TABLE_SCHEMA not in ('information_schema','performance_schema','sys')
GROUP BY TABLE_NAME
order by 6 desc limit 50
sql结果为:
TABLE_SCHEMA TABLE_NAME DATA_LENGTH INDEX_LENGTH TOTDB_SIZE TABLE_ROWS
report report_opr_detl 1078MB 0MB 1078MB 1778206
报告表report_opr_detl大小为1078MB,行数为1778206,
2.但是当我们检查 os 文件系统中的表大小时。
它报告大小为 1.5G。与第 1 步结果不同 (1078MB)
[root@pommodb02 report]# du -sh report_opr_detl*
46K report_opr_detl.frm
1.5G report_opr_detl.ibd
它报告表的计数(*)是 2162772 行。与第 1 步结果不同(1778206 行)
mysql> select count(*) from report.report_opr_detl;
+----------+
| count(*) |
+----------+
| 2162772 |
+----------+
1 row in set (0.65 sec)
3.所以我的问题是为什么第1步和第2步不同,
【问题讨论】:
-
不需要
SUM()和GROUP BY。每张桌子只有一行,所以没有什么要分组的。 -
这是一个 InnoDB 表吗?表大小信息只是近似值。
-
是的,它是一个innodb表,好吧,看它只是近似值
-
@Barmar,table_rows 和 avg_row_size 是根据抽样几页估计的,但是 data_length、index_length 和 data_free 是基于为表空间分配的物理盘区数,所以应该是准确的。