mysql 統計資訊記錄
相關引數
計資訊的持久化功能
系統級---innodb_stats_persistent = ON
表級- STATS_PERSISTENT = 1
統計資訊的持久化優化自動計算
系統級--innodb_stats_auto_recalc
表級--STATS_AUTO_RECALC
持久化統計資訊時包含被打上刪除標記的記錄
系統級--innodb_stats_include_delete_marked
統計資訊取樣
innodb_stats_persistent_sample_pages 預設為20
mysql> show global variables like '%innodb_stats%'; +--------------------------------------+-------------+ | Variable_name | Value | +--------------------------------------+-------------+ | innodb_stats_auto_recalc | ON | | innodb_stats_include_delete_marked | OFF | | innodb_stats_method | nulls_equal | | innodb_stats_on_metadata | OFF | | innodb_stats_persistent | ON | | innodb_stats_persistent_sample_pages | 20 | | innodb_stats_sample_pages | 8 | | innodb_stats_transient_sample_pages | 8 | +--------------------------------------+-------------+ 8 rows in set (0.01 sec)
統計資訊的持久化優化手動計算
ANALYZE TABLE
FLUSH TABLE tbl_name ---重新載入更新過後的統計資訊
當某表新增新的索引時,無論系統引數innodb_stats_auto_recalc的值如何,都會觸發重新計算索引統計資訊(不是表及其資料相關統計資訊)並將其新增到innodb_index_stats表中。
要想在新增索引時資料相關的統計資訊同時更新到mysql.innodb_table_stats表中,需要啟用系統變數innodb_stats_auto_recalc或者修改表的innodb_stats_auto_recalc建表選項,或者對錶執行ANALYZE TABLE語句。
2.相關的表
innodb_table_stats
-
database_name:資料庫名稱。
-
table_name:表名、分割槽名或子分割槽名稱。
-
last_update:表示InnoDB上次更新此統計資訊行的時間戳。
-
n_rows:表中的估算資料記錄行數。
-
clustered_index_size:主鍵索引的大小,以頁為單位的估算數值。
-
sum_of_other_index_sizes:其他(非主鍵)索引的總大小,以頁為單位的估算數
innodb_index_stats
-
database_name:資料庫名稱。
-
table_name:表名、分割槽表名、子分割槽表名稱。
-
index_name:索引名稱。
-
last_update:表示InnoDB上次更新此統計資訊行的時間戳。
-
stat_name:統計資訊名稱,其對應的統計資訊值儲存在stat_value列。
-
stat_value:儲存統計資訊名稱stat_name列對應的統計資訊值。
-
sample_size:stat_value列中提供的統計資訊估計值的取樣頁數。
-
stat_description:統計資訊名稱stat_name列中指定的統計資訊的說明資訊。
從表中查詢所得的資料中,我們可以看到:
-
stat_name列一種有如下幾種統計值。
* size:當stat_name為size值時,stat_value列值表示索引中的總頁數量。
* n_leaf_pages:當stat_name為n_leaf_pages值時,stat_value列值顯示索引葉子頁的數量。
* n_diff_pfxNN:NN代表數字(例如:01,02等),當stat_name為n_diff_pfxNN時,stat_value列值顯示索引的first column(即索引的最前索引列,從索引定義順序的第一個列開始)列的唯一值數量,例如:當NN為01時,stat_value列值就表示索引的第一個列的唯一值數量,當NN為02時,stat_value列值就表示索引的第一和第二個列的組合唯一值數量,以此類推。此外,在stat_name = n_diff_pfxNN的情況下,stat_description列顯示一個以逗號分隔的計算索引統計資訊列的列表。
-
從index_name為PRIMARY資料行的stat_description列的描述資訊"a,b"中,我們可以看出 ,主鍵索引的統計資訊列實際上就等於定義的索引列數量。
-
從index_name為i2uniq資料行的stat_description列的描述資訊"e,f"中,我們可以看出 ,唯一索引的統計資訊列實際上就等於定義的索引列數量。
-
從index_name為i1資料行的stat_description列的描述資訊 "c,d,a,b"中,我們可以看出,普通索引(非唯一的輔助索引)的統計資訊列實際上除了定義的索引列之外,還包含了主鍵列。即對於非唯一索引在該表中記錄的統計資訊,InnoDB會附加主鍵列。
-
注意:MySQL 5.7中系統變數innodb_stats_persistent_sample_pages定義的持久化統計資訊取樣頁為20,這裡示例中的sample_size列值為1是因為表中資料量太小,在一個頁中已經足夠存放,所以實際取樣也只使用了1個頁,如果資料量夠多,則這裡顯示的值就會為innodb_stats_persistent_sample_pages系統變數指定的值。
索引大小的計算
SELECT SUM(stat_value) pages, index_name, SUM(stat_value)*@@innodb_page_size size FROM mysql.innodb_index_stats WHERE table_name='dept_emp' AND stat_name = 'size' GROUP BY index_name;