環境
- MySQL 5.7
やりたいこと
どのテーブルが容量喰ってるのか調査したい
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フィールドとはMySQLのSQLの投げまくった結果、DELETEとかで断片化してしまった部分の容量らしい。
もし Data_free だとすると、これは使用されていないエクステントのサイズを示しています。実際には、ページ単位の空き領域の合算値を示すこととなり、フラグメンテーションを起こしているかどうかの指標になります。
眠い あとで追記する