mysql二級索引儲存的值 Mysql二級索引

2021-10-17 18:18:21 字數 729 閱讀 3017

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

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

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

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

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

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

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

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

explain使用說明:

mysql二級索引

聚集索引葉子節點存放記錄 非聚集索引葉子節點存放key和主鍵資訊 二級索引查詢比聚集索引慢,需要回表 iot表 拆表人肉回表 myisam索引是堆表 也是有序的 myisam主鍵和唯一索引的效率相當,不需要再回表 資料檔案位址修改了,iot不需要修改 myisam適合讀的應用 innodb適合寫 i...

mysql二級索引 mysql 什麼是二級索引

alter table t1 add index or create index alter table t1 add fulltext index alter table t1 add column,algorithm inplace opimize t1 對於最後兩個用例,alter 會建立乙個...

mysql索引,雜湊索引,聚集索引,二級索引

雜湊索引 雜湊索引,只有精確匹配索引所有列的查詢才有效,對於每一行資料,儲存引擎都會對所有的索引計算乙個雜湊碼。雜湊索引將所有的雜湊碼儲存在索引中,同時在雜湊表中儲存指向每個資料行的指標。如果多個列的雜湊值相同,索引會以鍊錶的方式存放多個指標記錄到同乙個雜湊條目中。因為索引自身只儲存對應的雜湊值,所...