MySQL統計信息相關的參數:mysql
1. innodb_stats_on_metadata(是否自動更新統計信息),MySQL 5.7中默認爲關閉狀態sql
僅在統計信息配置爲非持久化的時候生效。
也就是說在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_recalcspa
是否自動觸發更新統計信息,僅影響持久化存儲的統計信息的表,閾值是變化的數據超過錶行數的10%。
也就是說,一個表索引統計信息是持久化存儲的,而且表中數據變化了超過10%,
若是innodb_stats_auto_recalc爲ON,就會自動更新統計信息,不然不會自動更新code
3. innodb_stats_persistent(非持久化統計信息開關),MySQL 5.7中默認爲打開,持久化存儲統計信息blog
該選項設置爲ON時候,統計信息會持久化存儲到磁盤中,而不是存在在內存中,
相反,若是是非持久化存儲的(存在內存中),相應的統計信息會隨着服務器的關閉而丟失。索引
4. innodb_stats_persistent_sample_pages (持久化更新統計信息時候索引頁的取樣頁數)內存
默認是20個page,若是設置的太高,那麼在更新統計信息的時候,會增長ANALYZE TABLE的執行時間。innodb
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