天天看點

myrocks統計資訊概述統計資訊InnoDB統計分析Rocksdb統計分析總結

title: mysql ・ myrocks ・ myrocks統計資訊

io主要跟資料量和緩存相關,而cpu主要跟參與排序比較的記錄數相關。 是以mysql5.6的統計資訊的名額主要是資料量和記錄數。例如:

table scan:全表掃描統計資訊包括資料量和記錄數。

index scan:索引統計資訊,索引鍵值分布情況,即cardinality。

range scan:索引範圍掃描統計資訊,一定範圍内的記錄數和資料量。

mysql5.6 代價計算都是在server層完成,且代價隻關心引擎層的資料量和行數,沒有考慮不同引擎存儲方式的差異,其代價也會存在差異。相對來說,5.7的代價統計方式更為合理。

對server層來說,不同存儲引擎都應提供以下統計資訊

索引的大小

索引的總行數

索引的鍵值分布, 不同長度字首的鍵值分布

一定範圍内的記錄數

下面分别介紹innodb和rocksdb的統計資訊

innodb的統計資訊可以通過下清單查詢

實際上innodb的統計資訊持久化在mysql.innodb_table_stats和mysql.innodb_index_stats這兩個表中

索引大小

索引鍵值分布

myrocks統計資訊概述統計資訊InnoDB統計分析Rocksdb統計分析總結

總行數

範圍統計

有一個規律是,上層範圍内的記錄數等于下層範圍内的page數。

每層最多讀取10個page,此層每頁記錄平均數=讀取的記錄數/讀取的page數。

假如此層範圍内page數>10, 那麼範圍内的記錄數=此層每頁記錄平均數*上層的範圍内的記錄數。

下層範圍内的記錄數依賴于上層範圍内的記錄數。這樣每層計算直到葉子層。

myrocks統計資訊概述統計資訊InnoDB統計分析Rocksdb統計分析總結

以下情況會觸發統計資訊更新

analyze table

距離上一次更新統計資訊,發生變化的行數超過一定數值時自動更新(transient:1/16, persistent :1/10)

create table/truncate table 會初始化統計資訊

查詢information_schema.tables information_schema.statistic(innodb_stats_on_metadata=on)

從server層來看,rocksdb統計資訊存儲在rocksdb資料字典ndex_statistics中

實際包含以下資訊

ndex_statistics并沒有像innodb統計資訊一樣提供mysql 下的表來查詢,但我們仍可以從information_schema.statistic檢視部分統計資訊。

從rocksdb層來看,統計資訊在每個sst file meta中都單獨儲存了自己的統計資訊

myrocks統計資訊概述統計資訊InnoDB統計分析Rocksdb統計分析總結

而資料字典ndex_statistics的資料是彙總了memtable和所有sstable統計資訊後的資料。

memtable 每插入一行資料會統計行數(num_entries_)和資料量(data_size_)

memtable flush時會将sst 統計資訊持久化到sst的meta中。

compact時新的統計資訊也會持久化到新生成的sst的meta中。

範圍分布

myrocks統計資訊概述統計資訊InnoDB統計分析Rocksdb統計分析總結

查找memtable(skiplist),一個估算規則是, 下層範圍内節點數=上層節點數*branching_factor。根據此規則可以估算memtable範圍内的資料。

myrocks統計資訊概述統計資訊InnoDB統計分析Rocksdb統計分析總結

相關代如下

查sstable,先定位每層範圍涉及的sstable,再估算範圍内的資料大小。如果某個sstable全包含在範圍内,則大小可以直接從sstable 的meta中擷取;如果sstable隻是半包含,那麼需要計算範圍在sstable中的offset,進而得到sstable中被包含的資料大小。

myrocks統計資訊概述統計資訊InnoDB統計分析Rocksdb統計分析總結
官方代碼實作假設記錄大小為100位元組(rocksdb_assumed_key_value_disk_size),stats.records = sz/rocksdb_assumed_key_value_disk_size; 實際沒有必要,實際上是可以通過上面的方法估算的。
這裡應該可以優化,比如可以考慮immutable memtable的行數

總大小

鍵值分布

而對于memtable和sstable共存的情況則隻考慮sstable,忽略memtable的鍵值分布

執行個體啟動時會從資料字典index_statistics讀取并初始化所有索引統計資訊。

analyze table 彙總memtable和所有sstable的統計資訊,并持久化到資料字典index_statistics。

flush memtable/compact 都會更新記憶體統計資訊,并不持久化。

flush memtable 新檔案的統計資訊會merge加入記憶體統計資訊中。

compact時會去掉老檔案的統計資訊,同時加上新生成檔案的統計資訊。

myrocks統計資訊概述統計資訊InnoDB統計分析Rocksdb統計分析總結

背景線程會定時持久化統計資訊到資料字典index_statistics

rocksdb和innodb統計資訊有很多相似之處,但rocksdb sstable單獨維護了統計資訊,是以rocksdb的統計資訊收集比innodb更快也更精确。同時,我們也看到了rocksdb的統計資訊還有需要改進的地方,官方也逐漸在完善。