MySQLのデータベースサイズは で計算できます
SELECT table_schema AS db_name, SUM(data_length + index_length) AS size
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema != 'INFORMATION_SCHEMA'
GROUP BY db_name
しかし、 データディレクトリのディスク使用量を調べることで、データベースサイズを計算することもできます。 これらの2つの数値は逸脱する必要がありますか?これらの方法のいずれかを使用する理由はありますか?拡張により、INFORMATION_SCHEMA.TABLES
のdata_length
およびindex_length
計算されましたか?
まあ、それはパフォーマンスの逸脱する2つの方法があるようです、
Statisticsinnodb_stats_on_metadata
(デフォルト)でクエリすると、統計が強制的に更新されます(キャッシュされていない場合)。これをオフにすることもできますが、そのためにはGLOBAL
を変更する必要があります。 ドキュメントから :
innodb_stats_on_metadata
が有効になっている場合、InnoDBは、SHOW TABLE STATUS
やなどのメタデータステートメントにアクセスすると、非永続 統計 を更新します。INFORMATION_SCHEMA.TABLES
またはINFORMATION_SCHEMA.STATISTICS
テーブル。 (これらの更新はANALYZE TABLE
で発生するものに似ています。)無効にすると、InnoDBはこれらの操作中に統計を更新しません。設定を無効にしておくと、テーブルまたはインデックスが多数あるスキーマのアクセス速度が向上します。また、InnoDBテーブルを含むクエリの実行プランの安定性を向上させることもできます。設定を変更するには、ステートメント
SET GLOBAL innodb_stats_on_metadata=mode
を発行します。モードはON
またはOFF
(または1
または0
)です。設定を変更するには、グローバルシステム変数を設定するのに十分な特権が必要であり(セクション5.1.9.1「システム変数特権」を参照)、すべての接続の操作に即座に影響します。
Cacheそうでない場合、INFORMATION_SCHEMA
は Table_statistics::get_stat
。それは information_schema_stats_expiry
に文書化されているようです。しかし、ANALYZE
テーブル(ドキュメントで言及されている)と テストスイート でキャッシュを更新できるようにも見えます。したがって、キャッシュはその数秒ドリフトする可能性があります。
他に文書化されたものやコード内に違いがあったと思わせるようなものは何もありません。