透析myisam和InnoDB的索引實現(xiàn)與不同

在 MySQL 中券腔,主要有四種類型的索引阱驾,分別為: B-Tree 索引, Hash 索引且叁, Fulltext 索引和 R-Tree 索引都哭。我們主要分析B-Tree 索引。

B-Tree 索引是 MySQL 數(shù)據(jù)庫中使用最為頻繁的索引類型逞带,除了 Archive 存儲引擎之外的其他所有的存儲引擎都支持 B-Tree 索引。Archive 引擎直到 MySQL 5.1 才支持索引纱新,而且只支持索引單個 AUTO_INCREMENT 列展氓。
不僅僅在 MySQL 中是如此,實際上在其他的很多數(shù)據(jù)庫管理系統(tǒng)中B-Tree 索引也同樣是作為最主要的索引類型脸爱,這主要是因為 B-Tree 索引的存儲結(jié)構(gòu)在數(shù)據(jù)庫的數(shù)據(jù)檢索中有非常優(yōu)異的表現(xiàn)遇汞。
一般來說, MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的結(jié)構(gòu)來存儲的,也就是所有實際需要的數(shù)據(jù)都存放于 Tree 的 Leaf Node(葉子節(jié)點) 空入,而且到任何一個 Leaf Node 的最短路徑的長度都是完全相同的络它,所以我們大家都稱之為 B-Tree 索引。當(dāng)然歪赢,可能各種數(shù)據(jù)庫(或 MySQL 的各種存儲引擎)在存放自己的 B-Tree 索引的時候會對存儲結(jié)構(gòu)稍作改造化戳。如 Innodb 存儲引擎的 B-Tree 索引實際使用的存儲結(jié)構(gòu)實際上是 B+Tree,也就是在 B-Tree 數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上做了很小的改造埋凯,在每一個Leaf Node 上面出了存放索引鍵的相關(guān)信息之外点楼,還存儲了指向與該 Leaf Node 相鄰的后一個 LeafNode 的指針信息(增加了順序訪問指針),這主要是為了加快檢索多個相鄰 Leaf Node 的效率考慮白对。
下面主要討論MyISAM和InnoDB兩個存儲引擎的索引實現(xiàn)方式:

  1. MyISAM索引實現(xiàn):MyISAM索引文件和數(shù)據(jù)文件是分離的掠廓,索引文件僅保存數(shù)據(jù)記錄的地址。
    1)主鍵索引:
    MyISAM引擎使用B+Tree作為索引結(jié)構(gòu)甩恼,葉節(jié)點的data域存放的是數(shù)據(jù)記錄的地址蟀瞧。下圖是MyISAM主鍵索引的原理圖:

    這里設(shè)表一共有三列,假設(shè)我們以Col1為主鍵条摸,圖myisam1是一個MyISAM表的主索引(Primary key)示意黄橘。可以看出MyISAM的索引文件僅僅保存數(shù)據(jù)記錄的地址屈溉。
    2)輔助索引(Secondary key)
    在MyISAM中塞关,主索引和輔助索引(Secondary key)在結(jié)構(gòu)上沒有任何區(qū)別,只是主索引要求key是唯一的子巾,而輔助索引的key可以重復(fù)帆赢。如果我們在Col2上建立一個輔助索引,則此索引的結(jié)構(gòu)如下圖所示:

    同樣也是一顆B+Tree线梗,data域保存數(shù)據(jù)記錄的地址椰于。因此,MyISAM中索引檢索的算法為首先按照B+Tree搜索算法搜索索引仪搔,如果指定的Key存在瘾婿,則取出其data域的值,然后以data域的值為地址烤咧,讀取相應(yīng)數(shù)據(jù)記錄偏陪。
    MyISAM的索引方式也叫做“非聚集”的,之所以這么稱呼是為了與InnoDB的聚集索引區(qū)分煮嫌。
  2. InnoDB索引實現(xiàn)
    然InnoDB也使用B+Tree作為索引結(jié)構(gòu)笛谦,但具體實現(xiàn)方式卻與MyISAM截然不同.
    1)主鍵索引:
    MyISAM索引文件和數(shù)據(jù)文件是分離的,索引文件僅保存數(shù)據(jù)記錄的地址昌阿。而在InnoDB中饥脑,表數(shù)據(jù)文件本身就是按B+Tree組織的一個索引結(jié)構(gòu)恳邀,這棵樹的葉節(jié)點data域保存了完整的數(shù)據(jù)記錄。這個索引的key是數(shù)據(jù)表的主鍵灶轰,因此InnoDB表數(shù)據(jù)文件本身就是主索引谣沸。

    (圖inndb主鍵索引)是InnoDB主索引(同時也是數(shù)據(jù)文件)的示意圖,可以看到葉節(jié)點包含了完整的數(shù)據(jù)記錄笋颤。這種索引叫做聚集索引乳附。因為InnoDB的數(shù)據(jù)文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有)椰弊,如果沒有顯式指定许溅,則MySQL系統(tǒng)會自動選擇一個可以唯一標(biāo)識數(shù)據(jù)記錄的列作為主鍵,如果不存在這種列秉版,則MySQL自動為InnoDB表生成一個隱含字段作為主鍵贤重,這個字段長度為6個字節(jié),類型為長整形清焕。
    2). InnoDB的輔助索引
    InnoDB的所有輔助索引都引用主鍵作為data域并蝗。例如,下圖為定義在Col3上的一個輔助索引:

    InnoDB 表是基于聚簇索引建立的秸妥。因此InnoDB 的索引能提供一種非彻鐾#快速的主鍵查找性能。不過粥惧,它的輔助索引(Secondary Index键畴, 也就是非主鍵索引)也會包含主鍵列,所以突雪,如果主鍵定義的比較大起惕,其他索引也將很大。如果想在表上定義 咏删、很多索引惹想,則爭取盡量把主鍵定義得小一些。InnoDB 不會壓縮索引督函。
    文字符的ASCII碼作為比較準(zhǔn)則嘀粱。聚集索引這種實現(xiàn)方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵辰狡,然后用主鍵到主索引中檢索獲得記錄锋叨。
    不同存儲引擎的索引實現(xiàn)方式對于正確使用和優(yōu)化索引都非常有幫助,例如知道了InnoDB的索引實現(xiàn)后搓译,就很容易明白
    1為什么不建議使用過長的字段作為主鍵悲柱,因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大些己;
    2用非單調(diào)的字段作為主鍵在InnoDB中不是個好主意豌鸡,因為InnoDB數(shù)據(jù)文件本身是一顆B+Tree,非單調(diào)的主鍵會造成在插入新記錄時數(shù)據(jù)文件為了維持B+Tree的特性而頻繁的分裂調(diào)整段标,十分低效涯冠,而使用自增字段作為主鍵則是一個很好的選擇。
    InnoDB索引和MyISAM索引的區(qū)別:
    一是主索引的區(qū)別逼庞,InnoDB的數(shù)據(jù)文件本身就是索引文件蛇更。而MyISAM的索引和數(shù)據(jù)是分開的。
    二是輔助索引的區(qū)別:InnoDB的輔助索引data域存儲相應(yīng)記錄主鍵的值而不是地址赛糟。而MyISAM的輔助索引和主索引沒有多大區(qū)別派任。
?著作權(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

推薦閱讀更多精彩內(nèi)容