web-dev-qa-db-ja.com

INFORMATION_SCHEMA.TABLEとファイルシステムのディスク使用量を計算していますか?

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.TABLESdata_lengthおよびindex_length計算されましたか?

1
Evan Carroll

まあ、それはパフォーマンスの逸脱する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_SCHEMATable_statistics::get_stat 。それは information_schema_stats_expiry に文書化されているようです。しかし、ANALYZEテーブル(ドキュメントで言及されている)と テストスイート でキャッシュを更新できるようにも見えます。したがって、キャッシュはその数秒ドリフトする可能性があります。

他に文書化されたものやコード内に違いがあったと思わせるようなものは何もありません。

1
Evan Carroll