1. 程式人生 > >MySQL索引統計資訊更新相關的引數

MySQL索引統計資訊更新相關的引數

MySQL統計資訊相關的引數:

  1. innodb_stats_on_metadata(是否自動更新統計資訊),MySQL 5.7中預設為關閉狀態

    僅在統計資訊配置為非持久化的時候生效。
    也就是說在innodb_stats_persistent 配置為OFF的時候,非持久化儲存統計資訊的手,innodb_stats_on_metadata的設定才生效。
    當innodb_stats_on_metadata設定為ON的時候,
    InnoDB在執show table status 或者訪問INFORMATION_SCHEMA.TABLES
    或者INFORMATION_SCHEMA.STATISTICS 系統表的時候,
    更新費持久化統計資訊(類似於ANALYZE TABLE),innodb_stats_on_metadata不管開啟還是關閉,都不影響持久化儲存統計資訊的索引
    某個索引的統計資訊更新時間參考mysql.innodb_index_stats這個系統表

某個索引的統計資訊更新時間參考mysql.innodb_index_stats這個系統表
select *
from mysql.innodb_index_stats
where table_name = 'teststatistics';

  2. innodb_stats_auto_recalc

    是否自動觸發更新統計資訊,僅影響持久化儲存的統計資訊的表,閾值是變化的資料超過錶行數的10%。
    也就是說,一個表索引統計資訊是持久化儲存的,並且表中資料變化了超過10%,
    如果innodb_stats_auto_recalc為ON,就會自動更新統計資訊,否則不會自動更新

  3. innodb_stats_persistent(非持久化統計資訊開關),MySQL 5.7中預設為開啟,持久化儲存統計資訊

    該選項設定為ON時候,統計資訊會持久化儲存到磁碟中,而不是存在在記憶體中,
    相反,如果是非持久化儲存的(存在記憶體中),相應的統計資訊會隨著伺服器的關閉而丟失。

  4. innodb_stats_persistent_sample_pages (持久化更新統計資訊時候索引頁的取樣頁數)

    預設是20個page,如果設定的過高,那麼在更新統計資訊的時候,會增加ANALYZE TABLE的執行時間。

  5. innodb_stats_transient_sample_pages(臨時性更新統計資訊時候索引頁的取樣頁數)

    預設值是8,innodb_stats_persistent設定為disable的情況下,也即非持久化明確關閉的時候,innodb_stats_transient_sample_pages才生效,
    也就是非持久化儲存過索引統計資訊的時候,innodb_stats_transient_sample_pages為更新統計資訊的取樣頁數
    這個值是否生效,要依賴於innodb_stats_on_metadata,而innodb_stats_on_metadata又依賴於innodb_stats_persistent
    總而言之:如果配置為持久化儲存統計資訊,非持久化相關的配置選項就不起作用

  6. innodb_stats_sample_pages

    已棄用. 已用innodb_stats_transient_sample_pages 替代。
    為啥要用innodb_stats_transient_sample_pages替代?
    個人猜測是一開始引數命名不規範,既然是臨時行統計資訊,卻沒有做到見名知意,與innodb_stats_persistent_sample_pages區分開來,
    或許是一開始MySQL中只有臨時行統計資訊,沒有持久化統計資訊。

統計資訊更新測試1:開啟innodb_stats_auto_recalc的情況下,統計資訊會在觸發其更新閾值後自動更新

查詢統計資訊更新時間

收集統計資訊之後再次查詢,innodb_index_stats表,統計資訊更新

  通過改變表的變化行數,使得統計資訊自動收集

  

統計資訊更新測試2:關閉innodb_stats_auto_recalc的情況下,統計資訊會在觸發其更新閾值後自動更新

    關閉自動收集統計資訊選項innodb_stats_auto_recalc

  

    往表中插入超過原表10%的資料(已經達到觸發統計資訊更新閾值的情況),統計資訊依舊沒有更新

  

   此時(關閉innodb_stats_auto_recalc的情況下),只有通過手動收集才能完成統計資訊的更新

  

MySQL可以在表上指定一個統計資訊取樣的page個數,並且可以修改表上的統計取樣page個數

-- 建立表的時候指定一個統計取樣page資料
create table testSamplePages
(
    id int,
    name varchar(50)
)ENGINE=InnoDB,
STATS_PERSISTENT=1,
STATS_AUTO_RECALC=1,
STATS_SAMPLE_PAGES=25;

--修改表的統計取樣page資料
ALTER TABLE testSamplePages
STATS_SAMPLE_PAGES 60