主码索引、聚集索引、非主码索引(辅助索引)、唯一索引、外键索引、复合索引、非主码索引、聚集主码(聚集索引)、单列索引、多列索引、普通索引等...
? 強烈建議看了第一個參考文獻再來看這個篇博文,因為此處不準備講底層數據結構的實現。
? 索引:索引(Index)是幫助MySQL高效獲取數據的數據結構。提取句子主干,就可以得到索引的本質:索引是數據結構。其表達的是存儲引擎的范疇,也就是說只有在存儲引擎級別談索引才有意義。MyISAM、InnoDB、Memory等。此處單純就InnoDB存儲引擎討論。
需要提前掌握B-TREE、B+TREE數據結構。注意B+樹“掃庫”的功能。
在數據之外,數據庫系統還維護著滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就可以在這些數據結構上實現高級查找算法。這種數據結構,就是索引
1、主碼索引:就是在主碼基礎上建立的索引。primary key。在InnoDB中,表數據文件本身就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,因此InnoDB表數據文件本身就是主索引。又稱主碼索引,聚集主碼。
此處的主索引又分為有序主碼索引(例如id自增),和不按序排列的索引(例如name-varchar類型),此時對填充因子影響特別大。
2、聚集主碼。為什么主碼索引(主索引)又稱為聚集主碼。此處的聚集其實是指數據文件與索引聚集在葉子節點,而不是像MyISAM中葉子節點存儲的是數據文件的地址。可以看到葉節點包含了完整的數據記錄。這種索引叫做聚集索引。因為InnoDB的數據文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵 (MyISAM可以沒有),如果沒有顯式指定,則MySQL系統會自動選擇一個可以唯一標識數據記錄的列作為主鍵,如果不存在這種列,則MySQL自動為 InnoDB表生成一個隱含字段作為主鍵,這個字段長度為6個字節,類型為長整形。
聚集索引:每個表至多一個聚集索引,術語“聚集”指實際的數據行和相關的鍵值都保存在一起。聚集索引不是一種單獨的索引類型,而是一種存儲數據方式。其具體細節依賴于實現方式,但是InnoDB的聚集索引實際上在同樣的結構中保存了B-Tree索引和數據行。當表有聚集索引的時候,它的數據行實際保存在索引的葉子頁中。每個表只能有一個聚集索引,因為不能一次把行保存在兩個地方。(但是,覆蓋索引可以模擬多個聚集索引)。
當前,SolidDB和InnoDB是唯一支持聚集索引的存儲引擎。InnoDB按照主鍵進行聚集,如果沒有定義主鍵,InnoDB會試著使用唯一的非空索引來代替。如果沒有這種索引,InnoDB就會定義隱藏的主鍵然后在上面進行聚集。
3、輔助索引。輔助索引是相對于主碼索引而言的。在MyISAM中,輔助索引的結構和主碼索引的結構是一樣的,都是采用的是B+樹結構,且葉子節點存儲的都是數據記錄的地址。而InnoDB中雖然也采用的是B+樹存儲,但是輔助索引的葉子節點存儲的是對應于主碼索引的主鍵。也就是說如果你通過輔助索引查找數據,要先在B+樹中查找到主鍵,然后根據主索引查找到對應的記錄,查找兩次。
4、非主碼索引。又稱非主索引和輔助索引,同上面輔助索引。
注:要求主碼列數據長度不能太長,因為輔助索引中葉子節點存儲主鍵值,太長會導致輔助索引的額外存儲空間太大。
5、唯一索引。唯一索引就是指列的值唯一,建立起來的索引,數據完整性檢查。主索引肯定是唯一索引。一張表中可以有多個唯一索引,并且可以為NULL的列也可以建立唯一索引(NULL!=NULL),但是一張表中只能有一個主索引(主鍵唯一),并且該列不能為NULL,如果定義了AUTO INCREMENT列,該列必須是主索引的一部分。
6、外鍵索引。外鍵索引其實就是主索引或者輔助索引,主要用于表之間的連接操作等與外鍵有關的操作。如果為某個外鍵字段定義了一個外鍵約束條件,MySQL就會定義一個內部索引來幫助自己以最有效率的方式去管理和使用外鍵約束條件。目前MySQL默認的存儲引擎中,只有InnoDB支持外鍵約束且不要求存在對應列的索引,但是通常考慮效率都應加上。
7、全文索引。文本字段上的普通索引只能加快對出現在字段內容最前面的字符串(也就是字段內容開頭的字符)進行檢索操作。如果字段里存放的是由幾個、甚至是多個單詞構成的較大段文字,普通索引就沒什么作用了。這種檢索往往以LIKE %word%的形式出現,這對MySQL來說很復雜,如果需要處理的數據量很大,響應時間就會很長。這類場合正是全文索引(full-text index)可以大顯身手的地方。在生成這種類型的索引時,MySQL將把在文本中出現的所有單詞創建為一份清單,查詢操作將根據這份清單去檢索有關的數 據記錄。全文索引即可以隨數據表一同創建,也可以等日后有必要時再使用下面這條命令添加:
ALTER TABLE tablename ADD FULLTEXT(column1, column2)
有了全文索引,就可以用SELECT查詢命令去檢索那些包含著一個或多個給定單詞的數據記錄了。下面是這類查詢命令的基本語法:
SELECT * FROM tablename
WHERE MATCH(column1, column2) AGAINST(‘word1′, ‘word2′, ‘word3′)
上面這條命令將把column1和column2字段里有word1、word2和word3的數據記錄全部查詢出來。
注解:InnoDB數據表5.6之前不支持全文索引。
8、復合索引。又稱混合索引或連接索引。符合索引其實就是多列索引。就是在幾個列的基礎上建立索引,其中復合索引的第一個列可以充當單列索引使用order by、group by等。當使用復合索引的時候,交換列的順序可能會創建更好的索引。
9、覆蓋索引。指滿足了查詢中給定表用到的所有的列。where子句、order by、group by以及select語句中的所有的列,全覆蓋。
覆蓋索引適合那些很多主碼較小長度和外鍵約束的大型規范化約束來說是理想的優化方式。因為InnoDB數據庫中主碼的值會被附加在非主碼索引的每個對應的葉子節點的后面。
10、單列索引。是個統稱。上述的主碼索引、唯一鍵索引、外鍵索引、聚集主碼、聚集索引、主索引等等,除了多列索引和聚合索引其他都屬于單列索引。
11、普通索引。就是不是主索引、唯一索引等的索引。
參考文獻:
1、MySQL索引背后的數據結構及算法原理
2、mysql索引的類型和優缺點
3、[轉]mysql索引結構原理、性能分析與優化
4、mysql索引之聚集索引
轉載于:https://www.cnblogs.com/xiangyangzhu/p/index.html
總結
以上是生活随笔為你收集整理的主码索引、聚集索引、非主码索引(辅助索引)、唯一索引、外键索引、复合索引、非主码索引、聚集主码(聚集索引)、单列索引、多列索引、普通索引等...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现Web虚拟现实的最轻松方案—A-Fr
- 下一篇: 【 D3.js 入门系列 --- 2 】