mysql——二級索引(輔助索引)
阿新 • • 發佈:2021-12-09
二級索引:葉子節點中儲存主鍵值,每次查詢資料時,根據索引找到葉子節點中的主鍵值,根據主鍵值再到聚簇索引中得到完整的一行記錄。
問題:
1.相比於葉子節點中儲存行指標,二級索引儲存主鍵值會佔用更多的空間,那為什麼要這樣設計呢?
InnoDB在移動行時,無需維護二級索引,因為葉子節點中儲存的是主鍵值,而不是指標。
2.那麼InnoDB有了聚簇索引,為什麼還要有二級索引呢?
聚簇索引的葉子節點儲存了一行完整的資料,而二級索引只儲存了主鍵值,相比於聚簇索引,佔用的空間要少。當我們需要為表建立多個索引時,如果都是聚簇索引,那將佔用大量記憶體空間,所以InnoDB中主鍵所建立的是聚簇索引,而唯一索引、普通索引、字首索引等都是二級索引。
3.為什麼一般情況下,我們建表的時候都會使用一個自增的id來作為我們的主鍵?
InnoDB中表中的資料是直接儲存在主鍵聚簇索引的葉子節點中的,每插入一條記錄,其實都是增加一個葉子節點,如果主鍵是順序的,只需要把新增的一條記錄儲存在上一條記錄的後面,當頁達到最大填充因子的時候,下一跳記錄就會寫入新的頁中,這種情況下,主鍵頁就會近似於被順序的記錄填滿。
若表的主鍵不是順序的id,而是無規律資料,比如字串,InnoDB無法加單的把一行記錄插入到索引的最後,而是需要找一個合適的位置(已有資料的中間位置),甚至產生大量的頁分裂並且移動大量資料,在尋找合適位置進行插入時,目標頁可能不在記憶體中,這就導致了大量的隨機IO操作,影響插入效率。除此之外,大量的頁分裂會導致大量的記憶體碎片。
Explain使用說明: