什麼是統計數據統計數據怎麼存儲兩種存儲方式:存儲形式:存儲的信息如何更新統計數據NULL 值如何統計參考文檔什麼是統計數據MySQL 為了制定執行計劃收集表的相關信息,如索引行數,索引基數(不同值的數量),占用頁面數等等。這些信息被稱為統計數據。同一條 sql 語句,在不同的數據量級下,不同的索引結... ...
什麼是統計數據
MySQL 為了制定執行計劃收集表的相關信息,如索引行數,索引基數(不同值的數量),占用頁面數等等。這些信息被稱為統計數據
。
同一條 sql 語句,在不同的數據量級下,不同的索引結構下,執行計劃都是千差萬別的。
而 MySQL 選定執行計劃的標準就是這些統計數據。
統計數據怎麼存儲
兩種存儲方式:
1. 基於磁碟的永久性存儲
2. 基於記憶體的非永久性存儲
預設情況下,MySQL 配置為持久化到磁碟,咱們這次也只討論持久化到磁碟的形式,因為基於記憶體的形式統計的數據與其相同。
在全局變數中有兩個值來標誌是否是用磁碟來存儲
innodb_stats_persistent
:是否使用磁碟
Innodb_stats_persistent_sample_pages
:統計數據的抽樣頁面數
存儲形式:
可以看到有兩個表存儲數據統計信息:innodb_table_stats
& innodb_index_stats
存儲的信息
首先來看 innodb_table_stats
中存儲結構
欄位含義:
欄位 | 含義 |
---|---|
database_name | 資料庫 |
table_name | 表名 |
last_update | 上次更新時間 |
n_rows | 表中行數 |
clustered_index_size | 聚簇索引占用的頁面數 |
sum_of_other_index_sizes | 除了聚簇索引之外的其他索引站用的頁面數 |
再來看一下 innodb_index_stats
中的信息
欄位 | 含義 |
---|---|
database_name | 資料庫 |
table_name | 表名 |
index_name | 索引名稱 |
last_update | 上次更新時間 |
stat_name | 可以看到最後一列的 stat_description 中有解釋這一列是什麼意思 n_leaf_pages : 葉子頁面的數量 size : 總頁面數。值得註意的是, n_diff_pfx01 和 n_diff_pfx02 , 這兩個是聯合索引中首碼索引的不同部分。 |
stat_value | 統計出的數值 |
sample_size | 為了統計上一個數值用了多少個頁面 |
stat_description | 對統計數據的簡介 |
如何更新統計數據
這些統計數據並非是一成不變的,否則資料庫的執行計劃會變得特別不准確。
有兩種方式來啟用統計數據更新:
• 開啟 innodb_stats_auto_recalc
(在頁面變動超過 10%【定義值】 時,觸發統計數據的計算,非同步過程,不會阻塞)
• 手動調用 ANALYZE TABLE
語句來更新統計信息 (同步過程,會阻塞
請求)
NULL 值如何統計
現在一切都很正常,除了 NULL (萬惡之源)
因為 NULL 有多重語義,對於基數來說,有三種解釋:
1. 列中所有的 NULL 都是同一個值,記為 1
2. 忽略 NULL,記為 0
3. 每個 NULL 都算作一個不同的值,記為 N
基於這個事實,mysql 為用戶提供了一個可配置的系統變數: innodb_stats_method
1. nulls_equal:對應上文 1
2. nulls_unequal:對應上文 2
3. nulls_ignored:對應上文 3
建議:最好不要在索引列中存放 NULL 值
參考文檔
《MySQL 是怎樣運行的:從根兒上理解 MySQL》
《MySQL 手冊》