本文梳理進(jìn)階篇的索引
梳理MySQL索引的一些知識點(diǎn)
- 索引概述
- 索引結(jié)構(gòu)
- 索引分類
- 索引語法
- SQL性能分析
- 索引使用
- 索引設(shè)計(jì)原則
本文談目錄1和2
索引概述
概述
MySQL的索引是幫助其高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)
,在數(shù)據(jù)之外,數(shù)據(jù)庫系統(tǒng)還維護(hù)著滿足特定查找算法的數(shù)據(jù)結(jié)構(gòu)瞒渠,這種數(shù)據(jù)結(jié)以某種方式引用(指向)數(shù)據(jù)站粟,這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)上實(shí)現(xiàn)高級查找算法锯岖,這種數(shù)據(jù)結(jié)構(gòu)就是索引堵未。
索引是數(shù)據(jù)結(jié)構(gòu)!
優(yōu)缺點(diǎn):
優(yōu)勢 | 劣勢 |
---|---|
提高數(shù)據(jù)檢索的效率栖袋,降低數(shù)據(jù)庫的IO成本 | 索引列要占據(jù)空間 |
通過索引對列數(shù)據(jù)進(jìn)行排序叹卷,降低數(shù)據(jù)排序成本。降低CPU而消耗 | 降低了表的更新的速度糊啡,對表進(jìn)行插入拄查,刪除,更新 效率降低棚蓄,因?yàn)橐婕暗剿饕男薷?/td>
|
索引結(jié)構(gòu)
結(jié)構(gòu)
索引結(jié)構(gòu) | 描述 |
---|---|
B+Tree索引 | 最常見的索引類型堕扶,大部分引擎都支持 |
Hash索引 | 底層數(shù)據(jù)結(jié)構(gòu)用哈希表實(shí)現(xiàn),只有精確匹配索引列的查詢才有效梭依,不支持范圍查找 |
R-Tree(空間索引) | 空間索引是MyISAM引擎特殊類型稍算,主要用于地理空間數(shù)據(jù)類型 |
Full-text(全文索引) | 通過建立倒序索引,快速匹配文檔的方式役拴,類似于lucence糊探、Solr、ES |
淺談樹
我們首先了解這個大部分引擎都支持的索引河闰,樹是一種數(shù)據(jù)結(jié)構(gòu)科平,先引入幾個樹的知識點(diǎn),二叉查找樹BST
姜性、平衡二叉樹AVL
瞪慧、多路平衡查找樹B-Tree
(這些樹,有機(jī)會會在數(shù)據(jù)結(jié)構(gòu)和算法中講解部念,發(fā)表此文時弃酌,剛講到鏈表),接下來引入本文的B+Tree(多路平衡查找樹)儡炼。
樹的度數(shù)
指的是一個節(jié)點(diǎn)的字節(jié)點(diǎn)個數(shù)
多路一個節(jié)點(diǎn)包含多子個節(jié)點(diǎn)
平衡每個節(jié)點(diǎn)的左右子樹高度差絕對值最多為1
B樹是一種平衡多路搜索樹妓湘,每個節(jié)點(diǎn)可以有兩個以上的節(jié)點(diǎn),B指的是Balances(平衡),統(tǒng)一概念B樹就是B-Tree樹乌询。
B+Tree是B樹的加強(qiáng)版榜贴,更充分利用節(jié)點(diǎn)空間,讓查找速度更加穩(wěn)定妹田。
所有數(shù)據(jù)出現(xiàn)在葉子節(jié)點(diǎn)唬党,葉子節(jié)點(diǎn)形成一個單向鏈表
MySQL的索引數(shù)據(jù)結(jié)構(gòu)對B+Tree樹又做了改進(jìn),增加了一個指向相鄰葉子節(jié)點(diǎn)的鏈表指針秆麸,形成了帶有順序指針的B+Tree
淺談Hash
哈希索引采用一定的hash算法初嘹,將鍵值
算成新的hash值,映射到對應(yīng)槽位沮趣,然后存儲hash表屯烦。如果兩個(或多個)鍵值一樣,映射到相同的槽位,產(chǎn)生了哈希沖突驻龟,可以通過鏈表來解決温眉。槽位后面加一個鏈表指向
Hash特點(diǎn)
- 只能用于對等比較,不支持范圍
- 無法利用索引完成排序操作
- 查詢效率高翁狐,只需要一次檢索(無哈希沖突)
思考
innoDb引擎采用B+Tree类溢,
相對于B樹:是因?yàn)閷蛹墱\:數(shù)據(jù)存葉子節(jié)點(diǎn),而B樹葉子和非葉子都會保存數(shù)據(jù)露懒,導(dǎo)致存儲的鍵值減少闯冷,指針減少,保存數(shù)據(jù)懈词,導(dǎo)致樹高
相對于哈希:支持范圍查找和排序