動かざることバグの如し

近づきたいよ 君の理想に

MySQLでテーブルごとのデータ量確認するSQL

環境

やりたいこと

どのテーブルが容量喰ってるのか調査したい

SQL

SELECT 
  table_name "Table",
  engine,table_rows "Table Rows", 
  ( data_length + index_length ) / 1024 / 1024 / 1024 "Data (GB)",  
  ( data_free )/ 1024 / 1024 / 1024 "Free Space (GB)" 
FROM information_schema.TABLES 
WHERE table_schema=database() 
ORDER BY (data_length+index_length) desc limit 10;

データベースごとで見たい場合

SELECT 
  table_schema "DB", 
  sum( table_rows ) "Table Rows",
  sum( data_length + index_length ) / 1024 / 1024 / 1024 "Data (GB)", 
  sum( data_free )/ 1024 / 1024 / 1024 "Free Space (GB)" 
FROM information_schema.TABLES 
GROUP BY table_schema;

data_freeとは

data_lengthはデータの容量、index_lengthはインデックスの容量となんとなく察しがつくがdata_freeってなんぞや

実は空き容量のことではない。

Data_freeフィールドとはMySQLSQLの投げまくった結果、DELETEとかで断片化してしまった部分の容量らしい。

もし Data_free だとすると、これは使用されていないエクステントのサイズを示しています。実際には、ページ単位の空き領域の合算値を示すこととなり、フラグメンテーションを起こしているかどうかの指標になります。

眠い あとで追記する