【问题标题】:question about information_schema.TABLES result关于 information_schema.TABLES 结果的问题
【发布时间】: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 是基于为表空间分配的物理盘区数,所以应该是准确的。

标签: mysql percona


【解决方案1】:
  • SUM 不包括Data_free

  • TABLE_ROWS 是 InnoDB 的近似值; COUNT(*) 是准确的。

  • 获取类似信息的另一种方式是SHOW TABLE STATUS

【讨论】:

    猜你喜欢
    • 2019-05-29
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多