實際生產中我們大多都採用的innodb儲存引擎,並且使用的是b+tree索引,那麼為什麼是b+tree索引知道麼.今天來分析下
長見的樹有如下:
二叉樹 binary search tree
平衡二叉樹 balanced binary search tree
多路查詢樹(b-tree)
如上圖我們如果查詢20需要經過30和21即可命中,但是極端情況下會出現如下圖所示:
會退化成乙個鍊錶,此時我們查詢20需要遍歷整個鍊錶才能命中查詢效率隨著鍊錶長度大大降低
再看平衡二叉樹平採用二分法思維把資料按規則組裝成乙個樹形結構的資料,用這個樹形結構的資料減少無關資料的檢索,大大的提公升了資料檢索的速度
特點:非葉子節點最多擁有兩個子節點,
樹的左右兩邊的層級數相差不會大於1;
沒有值相等重複的節點;
非葉子節值大於左邊子節點、小於右邊子節點;
由此我們可以知道,隨著表中的資料量主鍵增大,平衡二叉樹的高度會急劇公升高,增大了磁碟io的次數,大大降低的查詢效率,並且節點儲存的資料量太小,沒有很好的利用磁碟的預讀能力
再看b-tree也叫絕對平衡的多路查詢樹,相對於平衡二叉樹的不同是,每個節點包含的關鍵字增多了,特別是在b樹應用到資料庫中的時候,資料庫充分利用了磁碟塊的原理(磁碟資料儲存是採用塊的形式儲存的,每個塊的大小一般為4k,每次io進行資料讀取時,同乙個磁碟塊的資料可以一次性讀取出來)把節點大小限制和充分使用在磁碟快大小範圍;把樹的節點關鍵字增多後樹的層級比原來的二叉樹少了,減少資料查詢的次數和複雜度;
再看b+tree ,他比b-tree更加強大,他的根節點和支節點不在儲存資料相關的資訊.只儲存了關鍵字和子節點的引用,這樣更充分的利用了節點的空間,比b-tree擁有更多的路數.更少的層級.遍歷速度也更快
並且葉子節點儲存了資料,天然的排序.並且相鄰節點具有順序引用的關係
mysql b+tree索引體現形式:
在myisam中雖然也是採用的b+tree索引,但是葉子節點中儲存的是該行資料的位址位置資訊,而innodb中是葉子節點儲存的是實際的相關資料,所以相比innodb而言myisam多了一次io操作.查詢效率更低
實際場景中我們的表不止乙個列有索引,更據實際業務場景可能存在多個列都有索引,其實輔助索引中的葉子節點只是儲存了主鍵索引中的指標而已.
MySQL索引,MySQL中索引的限制?
mysql中索引的限制 1 myisam儲存引擎引鍵的長度綜合不能超過1000位元組 2 blob和text型別的列只能建立字首索引 3 mysql目前不支援函式索引 4 使用!或者 的時候mysql不能使用索引 5 過濾字段使用了函式運算的時候如 abs key sum key 的時候mysql無...
mysql中的索引
mysql中的索引 什麼是索引?索引是對資料庫中某乙個表的資料進行排序,這種排序並不是真正的對錶中資料按照大小排序,而是另外再建立乙個索引檔案來存放包含btree資料結構,在資料結構中根據索引欄位的值排序,資料結構的值包括 索引欄位的值和索引對應資料行的位址。索引查詢就是先查詢這個索引檔案來獲得資料...
MySql中的索引
索引就是資料庫內部對某個表的所有資料預先進行的某種排序,以便於後面的快速查詢。作用 可以極大的加快資料的查詢速度 通常所謂的建立索引,就是指定乙個表的某個或某些字段作為 索引資料字段 就可以了,形式為 索引型別 要建立的索引的欄位名 create table if notexists 表名 欄位1,...