您好,登錄后才能下訂單哦!
本篇內容介紹了“MySQL InnoDB索引的存儲結構和分類”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
InnoDB索引采用了B-Tree的數據結構,數據存儲在葉子節點上,每個葉子節點默認的大小是16KB。
當新記錄插入到InnoDB聚簇索引中時,如果按順序插入索引記錄(升序或降序),當達到葉子節點最大的容量時,下一條記錄就會寫到新的的頁中。
葉子節點可使用的容量為總容量的15/16,InnoDB會留1/16的空間,以備將來插入和更新索引記錄時使用, 如果以隨機順序插入記錄,則頁面的容量為1/2到15/16之間。
你可以設置 innodb_page_size 來調整頁的大小,支持 64KB, 32KB, 16KB (默認), 8KB, 和4KB。
InnoDB的索引類型分為主鍵索引和非主鍵索引。
主鍵索引的葉子節點存的是整行數據。在 InnoDB 里,主鍵索引也被稱為聚簇索引(clustered index)。整張表的數據其實就是存儲在聚簇索引中的,聚簇索引就是表。
如果沒有設置主鍵怎么辦呢?MySQL會自動選擇一個可以唯一標識數據記錄的列作為主鍵,如果不存在這種列,則MySQL自動為InnoDB表生成一個隱含字段作為主鍵。
聚簇索引結構如下圖所示:
非主鍵索引的葉子節點內容是主鍵的值。在 InnoDB 里,非主鍵索引也被稱為二級索引(secondary index)。
二級索引的葉子節點中存的是主鍵的值,不是原始的數據,所以二級索引找到主鍵的值之后,需要用該主鍵再去主鍵索引上查找一次,才能獲取到最終的數據,這個過程叫做回表,這也是“二級”的含義。
二級索引結構如下圖所示:
由于二級索引中保存了主鍵值,所以索引主鍵值越小越好,以免二級索引占用的空間過大,一般建議使用int的自增列作為主鍵。
這樣可以保證數據行是按順序寫入的,對于根據主鍵做關聯操作的性能也會更好。
因為主鍵是順序的,所以每一條記錄都保存在上一條記錄的后面,當前的頁寫滿的時候,下一條記錄就寫在新的頁中。
這樣在讀取數據的時候,就可以按順序讀取,充分利用了局部性的優勢,大大提高了讀取效率。
自增主鍵新增數據示例:
建議避免使用UUID作為聚簇索引,它使得聚簇索引的插入變得完全隨機,使得數據沒有任何聚集特性。
因為UUID主鍵是隨機生成的,新的主鍵不一定比上一個主鍵大,所以無法每次都把新的主鍵插入到最后面,需要為新的主鍵尋找合適的位置,通常在已有數據的中間位置。
在頁中間插入數據需要重新分配空間,以及移動旁邊的數據,這樣會導致頻繁的頁分裂操作同時會產生碎片。
UUID主鍵新增數據示例:
所以,聚簇索引最好用自增的列,并且要盡可能的小,這樣可以避免二級索引過大。
“MySQL InnoDB索引的存儲結構和分類”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。