聚簇索引和覆蓋索引
阿新 • • 發佈:2019-01-03
參考:深入淺出MySql和高效能MySql
聚簇索引:聚簇索引並不是一種單獨的索引型別,而是一種資料儲存方式。
聚簇索引是將資料行的內容放在B--tree的葉子節點中,節點列存放資料列,由於不能把資料行放在兩個不同的地方,所以每個表只能有一個聚簇索引。MySql的聚簇索引只能將主鍵作為索引。如果沒有主鍵,則選擇唯一的非空索引,如果都沒有,則隱式定義主鍵,但是這樣很不好,相鄰鍵值相距會很遠。
因為聚簇索引將相鄰鍵值的資料行存在一起,所以能很快的查詢到相關資料。
聚簇索引缺陷:
:如果資料全部存在記憶體內,則訪問的順序不重要,此時聚簇索引失去了其優勢。
:依賴插入順序,如果不是按主鍵順序插入,則最好優化一下表。
:更新聚簇索引代價很高,InnoDB將被更新的行強制移動到別的位置。
:插入操作或者更新主鍵時可能會導致頁分裂。
:導致全表掃描變慢。
:二級索引更大。因為二級索引的包含了行的主鍵值。
聚簇索引和非聚簇索引的區別在於聚簇索引的葉子節點裡包括了資料行的內容,而非聚簇索引葉子節點裡不是,可以是資料存放的地址,也可以是二級索引指向表的主鍵值。
覆蓋索引:一個索引包含所有要查詢的欄位的值。
優點:
①:索引條目通常遠小於資料行,因此如果只讀取索引,可以極大的減小資料訪問量,同樣索引也更容易放入記憶體,所以對於I/O密集型的應用有很大幫助。
②:索引是按照列順序儲存的。
③:有的儲存引擎如MyIsam只在記憶體中快取索引,資料依賴於作業系統快取,因此覆蓋索引避免了頻繁的系統呼叫。
覆蓋索引必須要儲存索引列的值,而雜湊索引,空間索引和全文索引都不儲存索引列的值,所以覆蓋索引必須使用B-Tree索引。