什麼是索引?索引就是排好序的資料結構,可以幫助我們快速的查詢到資料
**幾種資料結構:
二叉樹:如果資料是單邊增長的情況 那麼出現的就是和鍊錶一樣的資料結構了,樹高度大
紅黑樹:在二叉樹的基礎上多了樹平衡,也叫二叉平衡樹,不像二叉樹那樣極端的情況會往乙個方向發展。
同樣我們查詢6,在二叉樹中我們需要經過6個節點才能找到(1-2-3-4-5-6),紅黑樹中我們只需要3個節點(2-4-6),但是mysql索引的資料結構並不是紅黑樹,因為如果資料量大了之後,樹的高度就會很大。
b樹:在紅黑樹的基礎上,每個節點可以存放多個資料
這個時候我們查詢6 只需要2個節點就可以了,而且樹的高度也比紅黑樹矮。
b+樹:b樹的變種
你會發現非葉子節點是會重複的,就像上面4,在葉子節點上面也出現了4,這是為什麼呢?因為它需要在葉子上面存放資料。那又是怎麼存放資料的呢?
mysql索引為什麼用b+樹
首先說一點,mysql索引的資料結構就是用到的b+樹。
myisam儲存引擎索引檔案和資料檔案是分離的
usertabmyisam表使用的myisam儲存引擎,表相關檔案有三個,.frm是存放表結構資料,myd是表資料。myi是存放索引,索引樹上會儲存資料在myd檔案裡面的位置。
innodb儲存引擎
usertab使用的innodb儲存引擎,表相關檔案只有兩個同樣.frm檔案是存放表結構資料,.ibd存放的資料和索引。
表資料檔案本身就是按b+tree組織的乙個索引結構檔案,主鍵索引葉節點包含了完整的資料記錄
以innodb為例:
資料是放在主鍵索引上面,也就是說實際上在每個節點上還會存放所有的資料
使用b樹存放資料之後實際是這樣子的,會在每個對應的索引列的值上存放上對應的資料
而b+樹則不同,它只會在葉子節點上面掛載資料,非葉子節點不會存放資料,資料只會存在葉子節點上面,非葉子節點只存放索引列的資料
這樣乙個節點就可以存放很多個索引列資料,一次io就可以拿到很多資料,mysql預設的乙個節點16k的大小,可以通過show global status like "innodb_page_size" 看到該值是16384,每次io讀取16k大小的資料,以索引列是bigint型別為例,大小8位元組,每一條資料還有乙個指向下一層的指標6位元組,16384/(8+6)=1170,乙個節點就大約可以存1170條資料。
以乙個層高為3的樹為例,葉子節點存放資料之後大小1kb,那麼這個樹可以存放 1170 *1170 *16 =21,902,400,大約2200萬條資料。所以在這種千萬級的表中通過主鍵索引查詢一條資料,最多3次io就可以找到一條資料。而很多時候樹的根節點基本都是在記憶體中,所以多數時候只需要2次io。
葉子節點之間也有雙向指標連線,提高區間範圍效能,範圍查詢。
建立索引的時候,可以選擇索引資料型別,乙個是btree乙個是hash,hash查詢當然也快,但是當遇到範圍查詢的時候hash就尷尬了,所以根據實際業務需求來看是用btree還是hash。
主鍵索引三問
為什麼非主鍵索引結構葉子節點儲存的是主鍵值?
一是保證一致性,更新資料的時候只需要更新主鍵索引樹,二是節省儲存空間。
為什麼推薦innodb表必須有主鍵?
保證會有主鍵索引樹的存在(因為資料存放在主鍵索引樹上面),如果沒有mysql會自己生成乙個rowid作為自增的主鍵主鍵索引
為什麼推薦使用整型的自增主鍵?
一是方便查詢比較,而是新增資料的時候只需要在最後加入,不會大規模調整樹結構,如果是uuid的話,大小不好比較,新增的時候也極有可能在中間插入資料,會導致樹結構大規調整,造成插入資料變慢。
聯合索引
可以理解成把幾個字段拼接起來的乙個普通索引
聯合索引使用,按照建索引的順序欄位來比較使用,參照左字首原則。
Mysq之索引(一) 索引資料結構
之前為了搞清楚這塊問題,看了很多文章都寫的迷迷糊糊的,我盡量寫的簡單明瞭一點,包看懂就好。先來思考索引的幾個問題?1.為什麼要給表加上主鍵?2.為什麼加索引後會使查詢變快?3.為什麼加索引後會使寫入 修改 刪除變慢?4.什麼情況下要同時在兩個欄位上建索引?帶著問題我們接下來看,索引是什麼?它的底層是...
mysql 資料結構 Mysql索引資料結構
mysql索引資料結構 當慢查詢時,看sql是否走索引。索引的本質 索引是幫助mysql高效獲取資料的排好序的資料結構。mysql若不建立索引,查詢某條資料時則會逐行掃瞄,每掃瞄一行資料就會做一次磁碟io。b tree 葉節點具有相同的深度,葉節點的指標為空。所有索引元素不重複。葉節點中的資料索引從...
MySQL索引資料結構
mysql官方對索引的定義為 索引 index 是幫助mysql高效獲取資料的資料結構。句子主幹就是索引是資料結構。資料庫查詢是資料庫的主要功能,我們都希望查詢資料的速度盡可能快,因此資料庫系統設計會從查詢的優化的角度進行優化。最基本的查詢演算法就是順序查詢,但這種複雜度為o n 查詢在資料量大的時...