文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man 頁面 (TGZ) - 258.2Kb
Man 頁面 (Zip) - 365.3Kb
資訊 (Gzip) - 4.0Mb
資訊 (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  排序索引建立

17.6.2.3 排序索引建立

在建立或重建索引時,InnoDB 會執行大量載入,而不是一次插入一個索引記錄。這種索引建立方法也稱為排序索引建立。空間索引不支援排序索引建立。

索引建立有三個階段。在第一階段,會掃描叢集索引,並產生索引項目,然後將其新增至排序緩衝區。當排序緩衝區滿載時,會對項目進行排序,並寫入至暫時中繼檔案。此程序也稱為「「執行」」。在第二階段,將一個或多個執行寫入至暫時中繼檔案後,會對檔案中的所有項目執行合併排序。在第三個也是最後一個階段,會將排序後的項目插入B 樹;最後階段為多執行緒。

在導入排序索引建立之前,會使用插入 API 一次將一個索引項目插入 B 樹。此方法涉及開啟 B 樹游標以尋找插入位置,然後使用樂觀插入將項目插入 B 樹頁面。如果由於頁面已滿而導致插入失敗,則會執行悲觀插入,其中涉及開啟 B 樹游標,並在必要時分割和合併 B 樹節點,以尋找項目的空間。這種建立索引的「「由上而下」」方法的缺點是,搜尋插入位置的成本以及 B 樹節點的不斷分割和合併。

排序索引建立使用「「由下而上」」的方法來建立索引。使用此方法時,會在 B 樹的所有層級保留對最右側葉頁面的參考。會配置必要 B 樹深度的最右側葉頁面,並依其排序順序插入項目。一旦葉頁面已滿,節點指標會附加至父頁面,並為下一個插入配置同級葉頁面。此程序會持續執行,直到插入所有項目,這可能會導致插入到根層級。當配置同級頁面時,會釋放對先前固定葉頁面的參考,並且新配置的葉頁面會成為最右側葉頁面和新的預設插入位置。

保留 B 樹頁面空間以供未來索引成長

若要預留空間以供未來索引成長,您可以使用 innodb_fill_factor 變數來保留 B 樹頁面空間的百分比。例如,將 innodb_fill_factor 設定為 80,會在排序索引建立期間保留 B 樹頁面中 20% 的空間。此設定同時適用於 B 樹葉頁面和非葉頁面。它不適用於用於 TEXTBLOB 項目的外部頁面。保留的空間量可能不會與設定完全相同,因為 innodb_fill_factor 值會被解讀為提示而非硬性限制。

排序索引建立與全文索引支援

全文索引支援排序索引建立。先前,會使用 SQL 將項目插入全文索引。

排序索引建立與壓縮資料表

對於壓縮表格,先前的索引建立方法會在壓縮和未壓縮頁面中附加條目。當修改日誌(代表壓縮頁面上的可用空間)滿時,會重新壓縮壓縮頁面。如果由於空間不足而導致壓縮失敗,則會分割頁面。透過排序索引建立,條目只會附加到未壓縮的頁面。當未壓縮的頁面變滿時,會進行壓縮。自適應填充用於確保在大多數情況下壓縮成功,但如果壓縮失敗,則會分割頁面並再次嘗試壓縮。此過程會持續到壓縮成功為止。有關 B 樹頁面壓縮的更多資訊,請參閱第 17.9.1.5 節「InnoDB 表格的壓縮運作方式」

排序索引建立和重做日誌

在排序索引建立期間會停用重做日誌。取而代之的是,會有一個檢查點,以確保索引建立可以承受意外退出或失敗。檢查點會強制將所有髒頁寫入磁碟。在排序索引建立期間,會定期向頁面清除器執行緒發出訊號,以刷新髒頁,確保可以快速處理檢查點操作。通常,當乾淨頁面的數量降至設定的閾值以下時,頁面清除器執行緒會刷新髒頁。對於排序索引建立,會立即刷新髒頁,以減少檢查點的開銷,並並行化 I/O 和 CPU 活動。

排序索引建立和最佳化工具統計資訊

排序索引建立可能會導致最佳化工具統計資訊與先前的索引建立方法所產生的統計資訊不同。統計資訊的差異是由於用於填充索引的不同演算法所造成,預計不會影響工作負載效能。