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