MySQL索引常見的模型及優(yōu)缺點總結(jié)

什么是索引蘑辑?索引又是用來干什么的骡显?

一句話概括就是:索引就是為了調(diào)高數(shù)據(jù)的查詢效率

就像書的目錄一樣星爪,如果你想找到某個知識點浆西,通常我們都是翻看書的目錄。同樣顽腾,索引其實就是數(shù)據(jù)庫表的“目錄”近零。

索引的常見模型

實現(xiàn)索引的數(shù)據(jù)結(jié)構(gòu)有很多,最常見的也是比較簡單的數(shù)據(jù)結(jié)構(gòu)有哈希表抄肖,有序數(shù)組和搜索樹久信。

哈希表

哈希表是一種以鍵-值(key-value)形式存儲數(shù)據(jù)的結(jié)構(gòu),我們只需要輸入查找的鍵key漓摩,就可以得到對應(yīng)的值value裙士。哈希的思路是,把值放在數(shù)組里管毙,用一個哈希函數(shù)把key換成一個確定的位置腿椎,然后把value放在數(shù)組的這個位置。

但是會有一種情況锅风,就是多個不同的key有可能通過哈希函數(shù)的換算得到相同的位置,解決這種情況就是在這個位置拉出一個鏈表鞍泉。

假如我們有一張用戶表皱埠,用戶昵稱(nickname)字段使用的是哈希索引,我們需要根據(jù)昵稱查詢用戶信息咖驮,這時哈希索引的示意圖如下所示:

哈希表

示意圖中边器,user3和user4根據(jù)nickname字段算出來的位置都是4,所以在4位置用了一個鏈表表示托修,當(dāng)我們在查詢的時候忘巧,比如我們根據(jù)nickname4查詢,查詢步驟就是:先使用哈希函數(shù)計算nickname3得到4睦刃,然后遍歷鏈表直到找到user4砚嘴。

優(yōu)點:因為哈希索引是根據(jù)索引字段計算位置,所以它的插入和根據(jù)key的查找會很快。

缺點:因為哈希索引是計算位置际长,而這個位置不一定是遞增的耸采,所以使用哈希索引做范圍查詢速度會很慢。如果要根據(jù)范圍查找數(shù)據(jù)工育,就必須全部掃描一遍索引才能找到虾宇。

適合場景:哈希表適用于等值查詢的場景,比如Redis或者其他的NoSQL數(shù)據(jù)庫如绸。

有序數(shù)組

還是上面的例子嘱朽,如果是使用有序數(shù)組索引的話,示意圖如下:

有序數(shù)組

這個數(shù)組是根據(jù)nickname遞增順序保存的怔接,如果我們要查nickname2對應(yīng)的用戶信息搪泳,用二分查找就可以很快找到對應(yīng)的結(jié)果,時間復(fù)雜度為O(log(N))蜕提。

當(dāng)然這個數(shù)據(jù)結(jié)構(gòu)也是支持范圍查詢的森书,如果我們想要查到[nicknameX,nicknameY]這個區(qū)間的用戶信息,我們只需要根據(jù)二分查找找到第一個nicknameX谎势,然后向右遍歷數(shù)組凛膏,找到找到最后一個nicknameY的用戶即可。

優(yōu)點:有序數(shù)組因為存入的數(shù)據(jù)已經(jīng)是排好序的脏榆,所以根據(jù)等值查到和范圍查到都比較快猖毫。

缺點:如果我們需要往數(shù)組中間插入一個值或者刪除中間的某個值,那就需要挪動這個值所在位置后面的所有元素须喂,成本比較高吁断。

適合場景:有序數(shù)組適用于靜態(tài)存儲引擎,存儲不會再修改的數(shù)據(jù)坞生,比如某個城市過去的人口數(shù)仔役。

二叉搜索樹

還是上面的例子,如果是二叉搜索樹的話是己,示意圖如下:

二叉搜索樹

二叉樹特點:每個節(jié)點的左兒子小于父節(jié)點又兵,父節(jié)點小于右兒子。如果我們要查user2的話卒废,跟著上圖我們的查詢路徑就是:userA -> userB -> userD -> user2沛厨。時間復(fù)雜度為O(log(N))。

優(yōu)點:查詢效率高

缺點:因為索引不止存在于內(nèi)存中摔认,也要寫到磁盤里逆皮。如果一個二叉樹高度為20,我們查詢某個用戶信息就要訪問20次磁盤参袱,這個效率是非常低的电谣。

適用場景:二叉樹適用于表數(shù)據(jù)比較少的引擎秽梅。

為了減少樹的高度,也就是減少對磁盤的訪問辰企,數(shù)據(jù)庫索引就不能用二叉樹风纠。那么既然有二叉數(shù),那就有N叉樹牢贸,這里的N取決于數(shù)據(jù)塊的大小竹观。

在MySQL中,索引是在存儲引擎層實現(xiàn)的潜索,不同存儲引擎的索引使用的數(shù)據(jù)結(jié)構(gòu)可能都不一樣臭增。InnoDB的索引使用的數(shù)據(jù)結(jié)構(gòu)為B+樹。

InnoDB的索引模型

在InnoDB中竹习,表都是根據(jù)主鍵順序以索引的i形式存放的誊抛,這種存儲方式的表稱為索引組織表。每一個索引在InndDB中都對應(yīng)一棵B+樹整陌。

假如我們有下面一張表:

create table T(
   id int primary key, 
   k int not null, 
   index (k)
)engine=InnoDB;

表中 R1~R5 的 (ID,k) 值分別為 (100,1)拗窃、(200,2)、(300,3)泌辫、(500,5) 和 (600,6)随夸,兩棵樹的示例示意圖如下:

B+樹

從圖中可以看出,根據(jù)葉子節(jié)點的數(shù)據(jù)震放,索引類型分為主鍵索引和非主鍵索引宾毒。

主鍵索引和非主鍵索引的區(qū)別:

  1. 主鍵索引的葉子節(jié)點存的是整行數(shù)據(jù),在InnoDB里殿遂,主鍵索引也叫做聚簇索引诈铛;非主鍵索引的葉子節(jié)點存的內(nèi)容是主鍵的值,在InnoDB里墨礁,非主鍵索引也叫做二級索引幢竹。

  2. 如果根據(jù)主鍵查詢,則只需要查找id索引樹即可恩静;如果根據(jù)非主鍵索引查找(查找的數(shù)據(jù)不只有主鍵)焕毫,則需要查找k索引樹找到對應(yīng)的主鍵,然后根據(jù)主鍵到id索引在查找一次蜕企。這個過程叫回表咬荷。

結(jié)束冠句!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轻掩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子懦底,更是在濱河造成了極大的恐慌唇牧,老刑警劉巖罕扎,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異丐重,居然都是意外死亡腔召,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門扮惦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臀蛛,“玉大人,你說我怎么就攤上這事崖蜜∽瞧停” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵豫领,是天一觀的道長抡柿。 經(jīng)常有香客問我,道長等恐,這世上最難降的妖魔是什么洲劣? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮课蔬,結(jié)果婚禮上囱稽,老公的妹妹穿的比我還像新娘。我一直安慰自己购笆,他們只是感情好粗悯,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著同欠,像睡著了一般样傍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铺遂,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天衫哥,我揣著相機(jī)與錄音,去河邊找鬼襟锐。 笑死撤逢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粮坞。 我是一名探鬼主播蚊荣,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼莫杈!你這毒婦竟也來了互例?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤筝闹,失蹤者是張志新(化名)和其女友劉穎媳叨,沒想到半個月后腥光,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡糊秆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年武福,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痘番。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡捉片,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汞舱,到底是詐尸還是另有隱情界睁,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布兵拢,位于F島的核電站翻斟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏说铃。R本人自食惡果不足惜访惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腻扇。 院中可真熱鬧债热,春花似錦、人聲如沸幼苛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舶沿。三九已至墙杯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間括荡,已是汗流浹背高镐。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留畸冲,地道東北人嫉髓。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像邑闲,于是被迫代替她去往敵國和親算行。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355