本節說明如何設定非持久性最佳化工具統計。當 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資料表的查詢執行計畫的穩定性。innodb_stats_on_metadata會使用SET陳述式進行全域設定。SET GLOBAL innodb_stats_on_metadata=ON注意innodb_stats_on_metadata僅在最佳化工具統計設定為非持久性時(當停用innodb_stats_persistent時)適用。啟動 mysql 用戶端時,若啟用
--auto-rehash選項(預設為啟用),則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 值。