Mysql
使用 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
但是您也可以通過查看數據目錄的磁碟使用情況來計算數據庫大小。這兩個數字應該偏離嗎?有沒有理由使用其中一種方法?通過擴展,
INFORMATION_SCHEMA.TABLES
’data_length
和是如何index_length
計算的?
好吧,似乎有兩種表現偏差的方式,
- 使用(預設)查詢時的統計
innodb_stats_on_metadata
資訊會強制更新統計資訊(如果未記憶體)。您可以將其關閉,但這樣做需要您進行GLOBAL
更改。從文件:啟用後,InnoDB 會在元數據語句(例如訪問 or 表時)更新非
innodb_stats_on_metadata
持久統計資訊。(這些更新類似於發生的情況。)禁用時,InnoDB 在這些操作期間不會更新統計資訊。禁用該設置可以提高具有大量表或索引的模式的訪問速度。它還可以提高涉及 InnoDB 表的查詢的執行計劃的穩定性。SHOW TABLE STATUS
INFORMATION_SCHEMA.TABLES
INFORMATION_SCHEMA.STATISTICS``ANALYZE TABLE
要更改設置,請發出語句
SET GLOBAL innodb_stats_on_metadata=mode
,其中 mode 是ON
orOFF
(或1
or0
)。更改設置需要足夠的權限來設置全域系統變數(請參閱第 5.1.9.1 節,“系統變數權限”)並立即影響所有連接的操作。
- 記憶體,否則似乎
INFORMATION_SCHEMA
正在從Table_statistics::get_stat
. 這似乎記錄在information_schema_stats_expiry
. 但似乎您也可以使用ANALYZE
table (文件提到)和testing suite刷新記憶體。所以記憶體可以漂移那麼多秒。我沒有看到任何其他文件或程式碼中讓我相信存在差異的內容。