當建立或重建索引時,InnoDB
執行批次載入,而不是一次插入一個索引記錄。這種索引建立方法也稱為排序索引建立。空間索引不支援排序索引建立。
索引建立分為三個階段。在第一階段,會掃描叢集索引,並產生索引項目並將其新增至排序緩衝區。當排序緩衝區變滿時,會對項目進行排序並寫入暫時的中間檔案。此流程也稱為「「執行」」。在第二階段,當一個或多個執行寫入暫時的中間檔案時,會對檔案中的所有項目執行合併排序。在第三個也是最後一個階段,會將排序後的項目插入B 樹;此最後一個階段是多執行緒的。
在引入排序索引建立之前,索引項目是使用插入 API 一次一個記錄地插入到 B 樹中的。此方法牽涉到開啟 B 樹游標以尋找插入位置,然後使用樂觀插入將項目插入 B 樹頁面中。如果由於頁面已滿而導致插入失敗,則會執行悲觀插入,這牽涉到開啟 B 樹游標,並視需要分割和合併 B 樹節點以尋找項目的空間。這種「「由上而下」」索引建立方法的缺點是尋找插入位置的成本,以及 B 樹節點不斷地分割和合併。
排序索引建立使用「「由下而上」」方法來建立索引。使用這種方法,在 B 樹的所有層級都會保留對最右側葉節點頁面的參照。會配置必要的 B 樹深度處的最右側葉節點頁面,並根據其排序順序插入項目。一旦葉節點頁面已滿,節點指標就會附加到父頁面,並為下一次插入配置同層級葉節點頁面。此流程會持續進行,直到插入所有項目,這可能會導致插入至根層級。當配置同層級頁面時,會釋放對先前固定葉節點頁面的參照,而新配置的葉節點頁面會成為最右側的葉節點頁面和新的預設插入位置。
為未來索引成長保留 B 樹頁面空間
為了預留未來索引成長的空間,您可以使用 innodb_fill_factor
變數來保留 B 樹頁面空間的百分比。例如,將 innodb_fill_factor
設定為 80,會在排序索引建置期間保留 B 樹頁面中 20% 的空間。此設定同時適用於 B 樹的葉節點和非葉節點頁面。它不適用於用於 TEXT
或 BLOB
條目的外部頁面。保留的空間量可能不完全符合配置,因為 innodb_fill_factor
值被解釋為提示,而非硬性限制。
排序索引建置和全文索引支援
排序索引建置支援 全文索引。先前,SQL 用於將條目插入全文索引。
排序索引建置和壓縮表格
對於壓縮表格,先前的索引建立方法將條目附加到壓縮和未壓縮的頁面。當修改日誌(表示壓縮頁面上的可用空間)填滿時,壓縮頁面將會重新壓縮。如果由於空間不足而導致壓縮失敗,頁面將會分割。使用排序索引建置時,條目只會附加到未壓縮的頁面。當未壓縮的頁面填滿時,它會被壓縮。自適應填充用於確保壓縮在大多數情況下成功,但如果壓縮失敗,頁面將會分割並再次嘗試壓縮。此過程會持續進行,直到壓縮成功。有關 B 樹頁面壓縮的詳細資訊,請參閱 第 17.9.1.5 節「InnoDB 表格的壓縮運作方式」。
排序索引建置和重做日誌
在排序索引建置期間會停用重做日誌。取而代之的是檢查點,以確保索引建置可以承受意外退出或故障。檢查點會強制將所有髒頁寫入磁碟。在排序索引建置期間,會定期通知頁面清除器執行緒刷新髒頁,以確保可以快速處理檢查點操作。通常,當乾淨頁面的數量低於設定的閾值時,頁面清除器執行緒會刷新髒頁。對於排序索引建置,會及時刷新髒頁,以減少檢查點開銷並並行處理 I/O 和 CPU 活動。
排序索引建置和最佳化工具統計資料
排序索引建置可能會導致最佳化工具統計資料與先前索引建立方法產生的統計資料不同。統計資料的差異,預計不會影響工作負載效能,是因為用於填充索引的演算法不同。