1. 程式人生 > >索引的型別和常見的索引

索引的型別和常見的索引

索引的型別(索引有很多種型別,在mysql中,並沒有統一的索引標準,不同的儲存引擎的索引的工作方式並不一樣,也不是所有的儲存引擎都支援所有型別的索引)

       1、B-Tree索引   大多數MySQL引擎都支援這種索引,對索引列是順序組織儲存的,很適合查詢範圍資料。如:像找出所有以I到K開頭的名字“這樣的查詢效率會非常高。適用於全鍵值,鍵值範圍或鍵字首(最左字首的查詢)查詢。

        2、雜湊索引    雜湊索引只包含雜湊值和行指標,而不儲存欄位值。

                                             無法用於排序,不是按照索引值順序儲存的

                                              不支援部分索引列匹配查詢(雜湊索引是使用索引列的全部內容來計算雜湊值得)

                                               只支援等值比較查詢,包括=、IN()、<=>

                                                不支援任何範圍查詢

       3、空間資料索引(R-Tree)

              MyISAM索引支援空間索引。 無須字首查詢,會從所有維度索引資料

        4、全文索引

         5、其他索引類別

               (第三方的儲存引擎來儲存索引,如:TokuDB 分形樹索引)

常見的索引有:

      1. 普通索引(無限制)

        2.唯一索引

                  主鍵就是唯一索引,但是唯一索引不一定是主鍵,唯一索引可以為空,但是空值只能有一個,主鍵不能為空。
普通唯一索引:單個欄位上建立唯一索引,需要此欄位所在的列上不能有重複的值,屬於二級索引。

複合唯一索引:多個欄位上聯合建立唯一索引,屬於二級索引。(參考了:https://www.jianshu.com/p/e1dce41a6b2b

         3.單列索引

         4.多列索引(字首)

         5.覆蓋索引 : 一個索引包含(或者說覆蓋)所有需要查詢的欄位的值 

         6.聚族索引

              InnoDB 主鍵使用的是聚簇索引,MyISAM 不管是主鍵索引,還是二級索引使用的都是非聚簇索引。

              聚族索引不是一種單獨的索引型別,而是一種資料儲存方式。InnoDB的聚族索引在同一結構中儲存了B-Tree索引和資料行。資料行存放在索引的葉子頁中,術語"聚族"表示資料行和相鄰的鍵值緊湊地儲存在一起。儲存引擎負責實現索引(不是所有的儲存引擎都支援聚族索引)。

              InnoDB將通過主鍵聚集資料,如果沒有定義主鍵,InnoDB會選擇一個唯一的非空索引代替。如果沒有這樣的索引,InnoDB會隱式定義一個主鍵來作為聚族索引。

               優點:1、資料訪問更快,聚族索引將索引和資料儲存在同一個B-Tree中,因此比在非聚族索引中獲取資料更快。

                       2、使用覆蓋索引掃描的查詢可以直接使用頁節點的主鍵值。

                缺點: 1.插入速度嚴重依賴於插入順序。按照主鍵的順序插入是載入資料到InnoDB表中速度最快的方式。但如果不是按主鍵插入,最好使用optimize table命令重新組織表

                           2.更新聚族索引列的代價很高。因為會強制InnoDB將每個被更新的行移動到新的位置。

                           3..基於聚族索引的表在插入新行,或者主鍵被更新導致需要移動行的時候,可能面臨“”頁分頁“的問題。

當行的主鍵值要求必須將這一行插入到某個已滿的頁中時,儲存引擎會將改頁分頁成兩個頁來容納該行,這就是一次頁分頁操作,會導致表佔用更多的磁碟空間。聚族索引可能導致全表掃描變慢,尤其是行比較稀疏或者是頁分裂儲存不連續的時候。

                           二級索引葉子節點儲存的不是指向行的物理位置的指標,而是行的主鍵值。

         7.全文索引

                    InnoDB 主鍵使用的是聚簇索引,MyISAM 不管是主鍵索引,還是二級索引使用的都是非聚簇索引。