本節說明如何配置非持久化最佳化工具統計資料。當 innodb_stats_persistent=OFF
或使用 STATS_PERSISTENT=0
建立或變更個別資料表時,最佳化工具統計資料不會保存到磁碟。相反地,統計資料會儲存在記憶體中,並且在伺服器關閉時遺失。統計資料也會透過某些操作並在特定條件下定期更新。
依預設,最佳化工具統計資料會由 innodb_stats_persistent
配置選項啟用並保存到磁碟。如需持久化最佳化工具統計資料的相關資訊,請參閱第 17.8.10.1 節,「配置持久化最佳化工具統計參數」。
最佳化工具統計資料更新
在以下情況下會更新非持久化最佳化工具統計資料:
執行
ANALYZE TABLE
。執行
SHOW TABLE STATUS
、SHOW INDEX
,或查詢資訊綱要TABLES
或STATISTICS
資料表並啟用innodb_stats_on_metadata
選項。innodb_stats_on_metadata
的預設設定為OFF
。啟用innodb_stats_on_metadata
可能會降低具有大量資料表或索引的綱要的存取速度,並降低涉及InnoDB
資料表的查詢的執行計畫穩定性。使用SET
陳述式全域配置innodb_stats_on_metadata
。SET GLOBAL innodb_stats_on_metadata=ON
注意innodb_stats_on_metadata
僅在將最佳化工具統計資料配置為非持久化時(當innodb_stats_persistent
停用時)適用。使用啟用
--auto-rehash
選項的 mysql 用戶端啟動,這是預設值。auto-rehash
選項會導致開啟所有InnoDB
資料表,並且開啟資料表操作會導致重新計算統計資料。為了改善 mysql 用戶端的啟動時間並更新統計資料,您可以使用
--disable-auto-rehash
選項關閉auto-rehash
。auto-rehash
功能可為互動式使用者啟用資料庫、資料表和欄名稱的自動名稱完成。第一次開啟資料表。
InnoDB
偵測到自上次更新統計資料以來已修改 1/16 的資料表。
配置取樣頁面的數量
MySQL 查詢優化器會使用關於索引分佈的估計統計資訊,根據索引的相對選擇性來選擇執行計畫的索引。當 InnoDB
更新優化器統計資訊時,它會從資料表的每個索引中取樣隨機頁面,以估計索引的基數。(此技術稱為隨機潛入。)
為了讓您控制統計資訊估計的品質(從而為查詢優化器提供更好的資訊),您可以使用參數 innodb_stats_transient_sample_pages
來變更取樣頁面的數量。預設的取樣頁面數量為 8,這可能不足以產生準確的估計,導致查詢優化器選擇不佳的索引。此技術對於大型資料表和用於聯結的資料表尤其重要。此類資料表不必要的完整資料表掃描可能會造成重大的效能問題。請參閱第 10.2.1.23 節,〈避免完整資料表掃描〉,以取得調整此類查詢的訣竅。innodb_stats_transient_sample_pages
是一個全域參數,可以在執行階段設定。
當 innodb_stats_persistent=0
時,innodb_stats_transient_sample_pages
的值會影響所有 InnoDB
資料表和索引的索引取樣。當您變更索引取樣大小時,請注意以下可能產生的重大影響:
像 1 或 2 這樣的小值可能會導致不準確的基數估計。
增加
innodb_stats_transient_sample_pages
值可能需要更多的磁碟讀取。遠大於 8(例如 100)的值可能會導致開啟資料表或執行SHOW TABLE STATUS
所需的時間顯著變慢。優化器可能會根據不同的索引選擇性估計來選擇非常不同的查詢計畫。
無論 innodb_stats_transient_sample_pages
的哪個值最適合系統,請設定該選項並將其保留在該值。選擇一個可以為資料庫中的所有資料表產生相當準確估計的值,而無需過多的 I/O。由於統計資訊會在執行 ANALYZE TABLE
以外的其他各種時間自動重新計算,因此增加索引取樣大小,執行 ANALYZE TABLE
,然後再次減小取樣大小是沒有意義的。
較小的資料表通常比大型資料表需要較少的索引樣本。如果您的資料庫有許多大型資料表,請考慮使用比您主要使用較小資料表時更高的 innodb_stats_transient_sample_pages
值。