5

データベースから以下の統計を解釈するのに問題がありMySql 5.5ます。

おそらく関連する補足情報:一部のテーブルには列が含まれており、それらの約TEXTには null 値があります。スペースのほとんどを占めるテーブルを作成しました 。MEDIUMTEXT50%optimize

  1. 質問: Mysql のドキュメントから data_free をどのように理解したか: 割り当てられたスペースはによって決定されますDDLが、現在は使用されていないため、基本的に行の null 値です。その解釈は正しいですか? そうでない場合、それはどのように正確に定義されていますか?

  2. 質問: data_free がインデックスとデータ長を合わせたものよりも大きくなる理由がわかりません

 

select (sum(data_length) + sum(INDEX_LENGTH))/ 1024 / 1024 as total, 
sum(data_free)/ 1024 / 1024  as free ,
sum(data_length)/ 1024 / 1024 as data, 
sum(INDEX_LENGTH/ 1024 / 1024) as index_data 
from information_schema.tables t
where t.TABLE_SCHEMA = 'foo'

結果:

total | free | data | index_data

19.5469   20.0000   18.1875 1.3594

だから私は20MB data_freeと を持ってい19.5MB data+indexます。それはどうしてですか?

ありがとう

4

1 に答える 1

8

MySQL 5.5 のデフォルトのストレージ エンジンである InnoDB を使用していると思います。

データを挿入すると InnoDB テーブルスペースが大きくなりますが、データを削除してもファイルは縮小しません。たとえば、100 万行を挿入してから削除すると、ファイルには物理的に割り当てられているが使用されていない大量の領域ができます。InnoDB は、可能であれば、テーブルスペース ファイルを再度拡張する前にそのスペースを再利用します。

また、削除しなくても、「無駄な」領域が発生する可能性があります。これは、テーブルスペース ファイルのサイズが大きくなると、設定オプションinnodb_autoextend_incrementでメガバイト単位で決定されるページの大きなチャンクによって拡張されるためです。それらのページがデータでいっぱいになるまで、それらは空き領域です。

InnoDB によって報告される Data_free は、中央のテーブルスペース ファイル内の空のページで「無駄になった」スペースの量です。NULL 値とは関係ありません。行を含まないデータ ページと関係があります。

さらに、MySQL 5.5 では、デフォルトで、すべてのテーブルが と呼ばれる 1 つの中央テーブルスペースを共有しますibdata。このテーブルスペース内のすべてのテーブルの data_Free は同じ数値を報告します。これは、1 つのテーブルだけでなく、テーブルスペース全体の空きページの容量です。

テーブルごとに個別のテーブルスペースを割り当てることもできます ( innodb_file_per_table=1)。個別のテーブルスペース内のテーブルの場合、data_free のテーブルごとに異なる値が表示されます。

Data_free は、完全に空のエクステントによって残されたスペースのみを報告します(エクステントは 1MB に等しいページのブロックです)。data_free は常に 1MB の倍数であることがわかります。空きページの小さなブロックは、data_free ではカウントされず、部分的に埋められたページもカウントされません。したがって、「無駄な」スペースはおそらくはるかに大きくなりますが、それを知る方法はありません.

于 2013-10-10T16:35:42.450 に答える