<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          圖解 MySQL 索引:B-樹、B+樹

          共 1909字,需瀏覽 4分鐘

           ·

          2021-03-18 00:12

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享 
          關(guān)注


          閱讀本文大概需要 3 分鐘。

          來自:cnblogs.com/liqiangchn/p/9060521.html

          看了很多關(guān)于索引的博客,講的大同小異。但是始終沒有讓我明白關(guān)于索引的一些概念,如B-Tree索引,Hash索引,唯一索引....或許有很多人和我一樣,沒搞清楚概念就開始研究B-Tree,B+Tree等結(jié)構(gòu),導致在面試的時候答非所問!本文中有關(guān)存儲引擎請查看MySQL存儲引擎-InnoDB和MyISAM。
          索引是什么?
          索引是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。
          索引能干什么?
          提高數(shù)據(jù)查詢的效率。
          索引:排好序的快速查找數(shù)據(jù)結(jié)構(gòu)!索引會影響where后面的查找,和order by 后面的排序。

          一、索引的分類

          1??從存儲結(jié)構(gòu)上來劃分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。
          2??從應用層次來分:普通索引,唯一索引,復合索引
          3??根據(jù)中數(shù)據(jù)的物理順序與鍵值的邏輯(索引)順序關(guān)系:聚集索引,非聚集索引。
          1??中所描述的是索引存儲時保存的形式,2??是索引使用過程中進行的分類,兩者是不同層次上的劃分。不過平時講的索引類型一般是指在應用層次的劃分。
          就像手機分類:安卓手機,IOS手機 與 華為手機,蘋果手機,OPPO手機一樣。
          普通索引:即一個索引只包含單個列,一個表可以有多個單列索引
          唯一索引:索引列的值必須唯一,但允許有空值
          復合索引:即一個索引包含多個列
          聚簇索引(聚集索引):并不是一種單獨的索引類型,而是一種數(shù)據(jù)存儲方式。具體細節(jié)取決于不同的實現(xiàn),InnoDB的聚簇索引其實就是在同一個結(jié)構(gòu)中保存了B-Tree索引(技術(shù)上來說是B+Tree)和數(shù)據(jù)行。
          非聚簇索引:不是聚簇索引,就是非聚簇索引(認真臉)。

          二、索引的底層實現(xiàn)

          mysql默認存儲引擎innodb只顯式支持B-Tree( 從技術(shù)上來說是B+Tree)索引,對于頻繁訪問的表,innodb會透明建立自適應hash索引,即在B樹索引基礎上建立hash索引,可以顯著提高查找效率,對于客戶端是透明的,不可控制的,隱式的。

          不談存儲引擎,只討論實現(xiàn)(抽象)
          Hash索引
          基于哈希表實現(xiàn),只有精確匹配索引所有列的查詢才有效,對于每一行數(shù)據(jù),存儲引擎都會對所有的索引列計算一個哈希碼(hash code),并且Hash索引將所有的哈希碼存儲在索引中,同時在索引表中保存指向每個數(shù)據(jù)行的指針。
          B-Tree索引(MySQL使用B+Tree)
          B-Tree能加快數(shù)據(jù)的訪問速度,因為存儲引擎不再需要進行全表掃描來獲取數(shù)據(jù),數(shù)據(jù)分布在各個節(jié)點之中。

          B+Tree索引
          是B-Tree的改進版本,同時也是數(shù)據(jù)庫索引索引所采用的存儲結(jié)構(gòu)。數(shù)據(jù)都在葉子節(jié)點上,并且增加了順序訪問指針,每個葉子節(jié)點都指向相鄰的葉子節(jié)點的地址。相比B-Tree來說,進行范圍查找時只需要查找兩個節(jié)點,進行遍歷即可。而B-Tree需要獲取所有節(jié)點,相比之下B+Tree效率更高。
          結(jié)合存儲引擎來討論(一般默認使用B+Tree)
          案例:假設有一張學生表,id為主鍵
          在MyISAM引擎中的實現(xiàn)(二級索引也是這樣實現(xiàn)的)
          在InnoDB中的實現(xiàn)

          三、問題

          問:為什么索引結(jié)構(gòu)默認使用B-Tree,而不是hash,二叉樹,紅黑樹?
          hash:雖然可以快速定位,但是沒有順序,IO復雜度高。
          二叉樹:樹的高度不均勻,不能自平衡,查找效率跟數(shù)據(jù)有關(guān)(樹的高度),并且IO代價高。
          紅黑樹:樹的高度隨著數(shù)據(jù)量增加而增加,IO代價高。
          問:為什么官方建議使用自增長主鍵作為索引。
          結(jié)合B+Tree的特點,自增主鍵是連續(xù)的,在插入過程中盡量減少頁分裂,即使要進行頁分裂,也只會分裂很少一部分。并且能減少數(shù)據(jù)的移動,每次插入都是插入到最后。總之就是減少分裂和移動的頻率。
          插入連續(xù)的數(shù)據(jù):
          插入非連續(xù)的數(shù)據(jù)
          <END>

          推薦閱讀:

          開發(fā)者用 M1 挖礦,每天掙 1 塊錢(代碼已開源)

          大屏監(jiān)控 Metabase 集成到 Java 項目

          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公眾號內(nèi)回復「2048」,即可免費獲取!!

          微信掃描二維碼,關(guān)注我的公眾號

          朕已閱 

          瀏覽 48
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲AV电影免费在线观看 | 毛片性爱视频 | 亚洲婷婷丁香五月天 | 成人视频网站18 | 久热精品在线观看 |