计算MySQL浪费了多少磁盘空间

时间:2019-10-21
本文章向大家介绍计算MySQL浪费了多少磁盘空间,主要包括计算MySQL浪费了多少磁盘空间使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

背景

最近我的订阅里推送了一篇歪果仁的文章。我看了一下文章觉得文章不好,然后看了一下作者,居然是印度人。因为之前乘坐深圳地铁,被印度人抢占过座位,所以专门写一篇文章来吐槽一下他的文章。(没有恶意,纯娱乐)

他的文章地址如下,有兴趣的同学请自备梯子:

https://thedataguy.in/mysql-calculate-how-much-disk-space-you-wasted/

他是一名云和数据库的架构师,擅长sql server、postgresql、my sql、mongodb、cassandra、cosmosdb

吐槽一,shell写得不好

我修改了一下他的shell,比他的看起来要好一些。

connect="mysql -uroot -proot -S /tmp/mysql3307.sock"
DB='test'
MYSQL_DATA_DIR=`mysql -uroot -proot -S /tmp/mysql3307.sock -NBe 'select @@datadir' 2>/dev/null`


TABLES=`ls -l $MYSQL_DATA_DIR/$DB/ | grep ibd | awk -F' ' '{print $9}' | sed -e 's/\.ibd//g'`
for x in `echo $TABLES`
do
  TB=$x
  SQL="SELECT data_length+index_length FROM information_schema.tables"
  SQL="${SQL} WHERE table_schema='${DB}' AND table_name='${TB}'"
  TBLSIZE_OPER=`ls -l $MYSQL_DATA_DIR/${DB}/${TB}.ibd | awk -F' ' '{print $5}'`
  TBLSIZE_INFO=`$connect -ANe"${SQL}" 2>/dev/null`
  TBLSIZE_FRAG=$(($TBLSIZE_OPER - $TBLSIZE_INFO))
  TBLSIZE_FRAG_GB=$(($TBLSIZE_FRAG / 1073741824))
  echo ${TB} ${TBLSIZE_FRAG_GB}
done

吐槽二,统计不精确

他用的是以GB为单位的。GB实在太不精确了,而且也不四舍五入一下。。

潜台词: 0.99G 也会被当做 0G

吐槽三,可以直接用SQL

他说他在dba stackexchange上搜索类似的问题时,发现了Rolando的出色脚本,然后做了修改。我想说,这个问题明明不需要用shell解决,可以直接用SQL解决。

正确做法

用SQL就可以解决:

#碎片
#总碎片(GB)
select sum(data_free)/1024/1024/1024 data_free from information_schema.tables where data_free > 0 ; 

#实例里每张表碎片大小(字节)
select  table_schema,table_name,data_free from information_schema.tables where data_free > 0 ;

#综合使用案例
select table_schema,table_name,table_rows,data_length,index_length,data_length+index_length,
concat(round((data_length+index_length)/1024/1024,2),'MB') 
data, concat(round(data_free/1024/1024,2),'MB') data_free from information_schema.tables where table_schema = 'test';

吐槽四,标题党

作者题目就是"计算MySQL浪费了多少磁盘空间",其实他只是计算MySQL数据库的表的碎片化程度,还有一种浪费磁盘空间的问题,就是undolog被撑大的问题,作者没有说。如果想梳理,还能说出其他浪费磁盘空间的情况呢。

当然,我也是标题党,因为我的文章标题是"计算MySQL浪费了多少磁盘空间",我最后只是一篇吐槽的娱乐文章。

原文地址:https://www.cnblogs.com/fander/p/11714669.html