1. 程式人生 > 其它 >mysql——二級索引(輔助索引)

mysql——二級索引(輔助索引)

二級索引:葉子節點中儲存主鍵值,每次查詢資料時,根據索引找到葉子節點中的主鍵值,根據主鍵值再到聚簇索引中得到完整的一行記錄。

問題:

1.相比於葉子節點中儲存行指標,二級索引儲存主鍵值會佔用更多的空間,那為什麼要這樣設計呢?

  InnoDB在移動行時,無需維護二級索引,因為葉子節點中儲存的是主鍵值,而不是指標。

2.那麼InnoDB有了聚簇索引,為什麼還要有二級索引呢?

  聚簇索引的葉子節點儲存了一行完整的資料,而二級索引只儲存了主鍵值,相比於聚簇索引,佔用的空間要少。當我們需要為表建立多個索引時,如果都是聚簇索引,那將佔用大量記憶體空間,所以InnoDB中主鍵所建立的是聚簇索引,而唯一索引、普通索引、字首索引等都是二級索引。

3.為什麼一般情況下,我們建表的時候都會使用一個自增的id來作為我們的主鍵?

  InnoDB中表中的資料是直接儲存在主鍵聚簇索引的葉子節點中的,每插入一條記錄,其實都是增加一個葉子節點,如果主鍵是順序的,只需要把新增的一條記錄儲存在上一條記錄的後面,當頁達到最大填充因子的時候,下一跳記錄就會寫入新的頁中,這種情況下,主鍵頁就會近似於被順序的記錄填滿。

  若表的主鍵不是順序的id,而是無規律資料,比如字串,InnoDB無法加單的把一行記錄插入到索引的最後,而是需要找一個合適的位置(已有資料的中間位置),甚至產生大量的頁分裂並且移動大量資料,在尋找合適位置進行插入時,目標頁可能不在記憶體中,這就導致了大量的隨機IO操作,影響插入效率。除此之外,大量的頁分裂會導致大量的記憶體碎片。

Explain使用說明:

https://segmentfault.com/a/1190000008131735