1. 程式人生 > 資料庫 >mysql 統計資訊記錄

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;