柚子快報邀請碼778899分享:數(shù)據(jù)庫 MySQL的索引
柚子快報邀請碼778899分享:數(shù)據(jù)庫 MySQL的索引
? ??????個人主頁:五敷有你? ? ??
??系列專欄:面經(jīng)
??穩(wěn)中求進(jìn),曬太陽
索引的概述
????????索引(index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)(有序)。在數(shù)據(jù)之外,數(shù)據(jù)庫系統(tǒng)還維護(hù)著滿足 特定查找算法的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù), 這樣就可以在這些數(shù)據(jù)結(jié)構(gòu) 上實現(xiàn)高級查找算法,這種數(shù)據(jù)結(jié)構(gòu)就是索引。
假如我們要執(zhí)行的SQL語句為 : select * from user where age = 45;
1). 無索引情況
在無索引情況下,就需要從第一行開始掃描,一直掃描到最后一行,我們稱之為 全表掃描,性能很 低。
2). 有索引情況
如果我們針對于這張表建立了索引,假設(shè)索引結(jié)構(gòu)就是二叉樹,那么也就意味著,會對age這個字段建 立一個二叉樹的索引結(jié)構(gòu)。
此時我們在進(jìn)行查詢時,只需要掃描三次就可以找到數(shù)據(jù)了,極大的提高的查詢的效率。
索引結(jié)構(gòu)
概述
MySQL的索引是在存儲引擎層實現(xiàn)的,不同的存儲引擎有不同的索引結(jié)構(gòu),主要包含以下幾種:
上述是MySQL中所支持的所有的索引結(jié)構(gòu),接下來,我們再來看看不同的存儲引擎對于索引結(jié)構(gòu)的支持 情況。
我們平常所說的索引,如果沒有特別指明,都是指B+樹結(jié)構(gòu)組織的索引。
B+Tree
B+Tree是B-Tree的變種,我們以一顆最大度數(shù)(max-degree)為4(4階)的b+tree為例,來看一 下其結(jié)構(gòu)示意圖:
我們可以看到,兩部分:
綠色框框起來的部分,是索引部分,僅僅起到索引數(shù)據(jù)的作用,不存儲數(shù)據(jù)。
紅色框框起來的部分,是數(shù)據(jù)存儲部分,在其葉子節(jié)點中要存儲具體的數(shù)據(jù)。
上述我們所看到的結(jié)構(gòu)是標(biāo)準(zhǔn)的B+Tree的數(shù)據(jù)結(jié)構(gòu),接下來,我們再來看看MySQL中優(yōu)化之后的 B+Tree。
MySQL索引數(shù)據(jù)結(jié)構(gòu)對經(jīng)典的B+Tree進(jìn)行了優(yōu)化。在原B+Tree的基礎(chǔ)上,增加一個指向相鄰葉子節(jié)點 的鏈表指針,就形成了帶有順序指針的B+Tree,提高區(qū)間訪問的性能,利于排序。
Hash
MySQL中除了支持B+樹索引,還支持一種索引 Hash索引。
1). 結(jié)構(gòu)
????????哈希索引就是采用一定的hash算法,將鍵值換算成新的hash值,映射到對應(yīng)的槽位上,然后存儲在 hash表中。
????????如果兩個(或多個)鍵值,映射到一個相同的槽位上,他們就產(chǎn)生了hash沖突(也稱為hash碰撞),可 以通過鏈表來解決。
2)特點:
Hash索引只能對等比較(=,in) ,不支持范圍查詢(between , > , < , 。。)
無法利用索引完成排序操作。
查詢效率高,通常在不存在hash沖突的情況下,只需要檢索一次。
3)存儲引擎支持:
支持hash索引的是Memory存儲引擎。 而InnoDB中具有自適應(yīng)hash功能,hash索引是 InnoDB存儲引擎根據(jù)B+Tree索引在指定條件下自動構(gòu)建的。
索引的分類
索引的分類
在MySQL數(shù)據(jù)庫,將索引的具體類型主要分為以下幾類:主鍵索引、唯一索引、常規(guī)索引、全文索引。
聚集索引和二級索引
而在在InnoDB存儲引擎中,根據(jù)索引的存儲形式,又可以分為以下兩種:
聚集索引選取規(guī)則:
如果存在主鍵,主鍵就是聚集索引。
如果不存在主鍵,將使用第一個唯一索引作為聚集索引。
如果沒有主鍵和唯一索引。innodb則會自動生成一個rowid作為隱藏的聚簇索引。
聚集索引和二級索引的具體結(jié)構(gòu)如下:
接下來,我們來分析一下,當(dāng)我們執(zhí)行如下的SQL語句時,具體的查找過程是什么樣子的。
具體過程是:
由于是name創(chuàng)建的二級索引,使用name的值進(jìn)行匹配,但在二級索引中只找到arm的id,
由于查詢返回的數(shù)據(jù)是* ,所以還需要根據(jù)主鍵值10。到聚集索引中查找10對應(yīng)的記錄,最終找到10對應(yīng)的行row。
最終拿到這一行的數(shù)據(jù),直接返回。
回表查詢: 這種先到二級索引中查找數(shù)據(jù),找到主鍵值,然后再到聚集索引中根據(jù)主鍵值,獲取 數(shù)據(jù)的方式,就稱之為回表查詢。
柚子快報邀請碼778899分享:數(shù)據(jù)庫 MySQL的索引
相關(guān)文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。