MySQL 配置統計資料
目錄
- 1. 什么是統計資料
- 2. 統計資料怎么存盤
- 2.1 兩種存盤方式
- 2.1.1 存盤形式
- 2.2 存盤的資訊
- 2.1 兩種存盤方式
- 3. 如何更新統計資料
- 4. NULL 值如何統計
- 5. 參考檔案
1. 什么是統計資料
MySQL 為了制定執行計劃收集表的相關資訊,如索引行數,索引基數(不同值的數量),占用頁面數等等,這些資訊被稱為統計資料,
同一條 sql 陳述句,在不同的資料量級下,不同的索引結構下,執行計劃都是千差萬別的,
而 MySQL 選定執行計劃的標準就是這些統計資料,
2. 統計資料怎么存盤
2.1 兩種存盤方式
1. 基于磁盤的永久性存盤
2. 基于記憶體的非永久性存盤
默認情況下,MySQL 配置為持久化到磁盤,咱們這次也只討論持久化到磁盤的形式,因為基于記憶體的形式統計的資料與其相同,
在全域變數中有兩個值來標志是否是用磁盤來存盤

innodb_stats_persistent:是否使用磁盤
Innodb_stats_persistent_sample_pages:統計資料的抽樣頁面數
2.1.1 存盤形式

可以看到有兩個表存盤資料統計資訊:innodb_table_stats & innodb_index_stats
2.2 存盤的資訊
首先來看 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 | 對統計資料的簡介 |
3. 如何更新統計資料
這些統計資料并非是一成不變的,否則資料庫的執行計劃會變得特別不準確,
有兩種方式來啟用統計資料更新:
? 開啟 innodb_stats_auto_recalc (在頁面變動超過 10%【定義值】 時,觸發統計資料的計算,異步程序,不會阻塞)
? 手動呼叫 ANALYZE TABLE 陳述句來更新統計資訊 (同步程序,會阻塞請求)
4. NULL 值如何統計
現在一切都很正常,除了 NULL (萬惡之源)
因為 NULL 有多重語意,對于基數來說,有三種解釋:
-
列中所有的
NULL都是同一個值,記為 1 -
忽略
NULL,記為 0 -
每個
NULL都算作一個不同的值,記為 N
基于這個事實,mysql 為用戶提供了一個可配置的系統變數: innodb_stats_method
-
nulls_equal:對應上文 1 -
nulls_unequal:對應上文 2 -
nulls_ignored:對應上文 3
建議:最好不要在索引列中存放 NULL 值
5. 參考檔案
《MySQL 是怎樣運行的:從根兒上理解 MySQL》
《MySQL 手冊》
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/52445.html
標籤:MySQL
上一篇:mysql資料型別
下一篇:MySQL-帳號操作
