乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      MySQL B 樹索引和哈希索引的區(qū)別

       mzsm 2016-02-15

      導(dǎo)讀

      在MySQL里常用的索引數(shù)據(jù)結(jié)構(gòu)有B+樹索引和哈希索引兩種,我們來看下這兩種索引數(shù)據(jù)結(jié)構(gòu)的區(qū)別及其不同的應(yīng)用建議。

      二者區(qū)別

      備注:先說下,在MySQL文檔里,實際上是把B+樹索引寫成了BTREE,例如像下面這樣的寫法:

      CREATE TABLE t(
      aid int unsigned not null auto_increment,
      userid int unsigned not null default 0,
      username varchar(20) not null default ‘’,
      detail varchar(255) not null default ‘’,
      primary key(aid),
      unique key(uid) USING BTREE,
      key (username(12)) USING BTREE此處 uname 列只創(chuàng)建了最左12個字符長度的部分索引
      )engine=InnoDB;

      一個經(jīng)典的B+樹索引數(shù)據(jù)結(jié)構(gòu)見下圖:
      20160106B樹索引
      (圖片源自網(wǎng)絡(luò))

      B+樹是一個平衡的多叉樹,從根節(jié)點到每個葉子節(jié)點的高度差值不超過1,而且同層級的節(jié)點間有指針相互鏈接。

      在B+樹上的常規(guī)檢索,從根節(jié)點到葉子節(jié)點的搜索效率基本相當(dāng),不會出現(xiàn)大幅波動,而且基于索引的順序掃描時,也可以利用雙向指針快速左右移動,效率非常高。

      因此,B+樹索引被廣泛應(yīng)用于數(shù)據(jù)庫、文件系統(tǒng)等場景。順便說一下,xfs文件系統(tǒng)比ext3/ext4效率高很多的原因之一就是,它的文件及目錄索引結(jié)構(gòu)全部采用B+樹索引,而ext3/ext4的文件目錄結(jié)構(gòu)則采用Linked list, hashed B-tree、Extents/Bitmap等索引數(shù)據(jù)結(jié)構(gòu),因此在高I/O壓力下,其IOPS能力不如xfs。

      詳細(xì)可參見:

      https://en./wiki/Ext4
      https://en./wiki/XFS

      哈希索引的示意圖則是這樣的:
      20160106哈希索引
      (圖片源自網(wǎng)絡(luò))

      簡單地說,哈希索引就是采用一定的哈希算法,把鍵值換算成新的哈希值,檢索時不需要類似B+樹那樣從根節(jié)點到葉子節(jié)點逐級查找,只需一次哈希算法即可立刻定位到相應(yīng)的位置,速度非???。

      從上面的圖來看,B+樹索引和哈希索引的明顯區(qū)別是:

      • 如果是等值查詢,那么哈希索引明顯有絕對優(yōu)勢,因為只需要經(jīng)過一次算法即可找到相應(yīng)的鍵值;當(dāng)然了,這個前提是,鍵值都是唯一的。如果鍵值不是唯一的,就需要先找到該鍵所在位置,然后再根據(jù)鏈表往后掃描,直到找到相應(yīng)的數(shù)據(jù);

      • 從示意圖中也能看到,如果是范圍查詢檢索,這時候哈希索引就毫無用武之地了,因為原先是有序的鍵值,經(jīng)過哈希算法后,有可能變成不連續(xù)的了,就沒辦法再利用索引完成范圍查詢檢索;

      • 同理,哈希索引也沒辦法利用索引完成排序,以及l(fā)ike ‘xxx%’ 這樣的部分模糊查詢(這種部分模糊查詢,其實本質(zhì)上也是范圍查詢);

      • 哈希索引也不支持多列聯(lián)合索引的最左匹配規(guī)則

      • B+樹索引的關(guān)鍵字檢索效率比較平均,不像B樹那樣波動幅度大,在有大量重復(fù)鍵值情況下,哈希索引的效率也是極低的,因為存在所謂的哈希碰撞問題。

      后記

      在MySQL中,只有HEAP/MEMORY引擎表才能顯式支持哈希索引(NDB也支持,但這個不常用),InnoDB引擎的自適應(yīng)哈希索引(adaptive hash index)不在此列,因為這不是創(chuàng)建索引時可指定的。

      還需要注意到:HEAP/MEMORY引擎表在mysql實例重啟后,數(shù)據(jù)會丟失。

      通常,B+樹索引結(jié)構(gòu)適用于絕大多數(shù)場景,像下面這種場景用哈希索引才更有優(yōu)勢:

      在HEAP表中,如果存儲的數(shù)據(jù)重復(fù)度很低(也就是說基數(shù)很大),對該列數(shù)據(jù)以等值查詢?yōu)橹?,沒有范圍查詢、沒有排序的時候,特別適合采用哈希索引

      例如這種SQL:
      SELECT … FROM t WHERE C1 = ?; — 僅等值查詢

      在大多數(shù)場景下,都會有范圍查詢、排序、分組等查詢特征,用B+樹索引就可以了。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多