Mysql索引詳解 1. 為什麼Mysql底層選擇B+樹作為資料結構? 2. Mysql索引節點 3. 存儲引擎 4. myisam引擎内容 5. InnoDB引擎内容 6. 索引優化 1. 為什麼Mysql底層選擇B+樹作為資料結構? 1. 二叉樹:容易轉換為連結清單。
2. 紅黑樹:資料層數太高。(二叉平衡樹)
3. B+ Tree: 多叉平衡樹。 索引節點是從左向右升序排列。
1.
4. B- Tree
1. 葉節點具有相同的深度,葉節點的指針為空。
2. 所有索引元素不重複。
3. 節點中的資料索引從左至右遞增排列。
2. Mysql索引節點 1. 一個索引節點配置設定16KB大小。
2. 索引資料和區間索引位址(兩個索引節點之間的資料所在的記憶體位址)構成。
3. MySQL根節點索引是常駐在記憶體中。
4. 每一次IO操作,都會擷取一個索引節點。
3. 存儲引擎 1. 存儲引擎是針對資料表,不是針對資料庫的一個庫中可以存儲不同存儲引擎的資料表。
4. myisam引擎内容 存儲資料相關檔案: tableName.frm:存儲table的表結構。 tableName.MYD:存儲table中的資料。 tableName.MYI:存儲table的索引。 查詢的過程 沒有索引:直接進行全表掃描。 存在索引: 查找索引(MYI檔案)。 根據索引中存儲的資料記憶體位址,在(MYD檔案)查找資料。 加載到記憶體中。 索引(非聚集索引) 索引檔案和資料檔案是分離的。 索引的葉子節點,存儲的是資料所在的記憶體位址。 Mysql-索引詳解 5. InnoDB引擎内容 存儲資料相關檔案: tableName.frm: 存儲table的表結構。 tableName.ibd:存儲table的索引以及資料。 面試題 為什麼InnoDB建議,必須建立主鍵,并且推薦使用整型的自增主鍵? InnoDB底層會根據主鍵,組建B+Tree的資料。 沒有建立主鍵時,InnoDB會在底層尋找一個不重複資料的列,作為主鍵索引,建構B+Tree的資料組成。若找不到合适列,Mysql會建立一個隐藏列,作為主鍵索引,建構B+Tree的資料組成。 推薦使用整型;是因為整型占用的存儲空間小,且容易比較大小(因為B+Tree是保證索引節點,是從左到右,依次遞增)。 使用自增;若主鍵時随意大小,那麼會導緻,葉子節點會進行分裂,且B+Tree會進行自平衡,降低效率。 BTree和B+Tree的差別? Btree葉子節點沒有關聯; B+Tree葉子節點之後是使用雙向連結清單結構,互相關聯在一起的。 Hash索引 定義:根據查找語句的字段,進行hash運算,得到磁盤對應的行存儲位址 。 優勢:對于=這樣的可以快速查詢。 劣勢:對于> or < 等等這種區域操作,則無法快速查詢資料。 索引(聚集索引): 索引檔案和資料檔案是在一起的。 索引的葉子節點,存儲的是對應索引的行完整資料。 聚集索引定義:就是索引的葉子節點,存儲的就是完整資料行。 葉子節點是資料結構是雙向指針;友善進行範圍的查找。 Mysql-索引詳解 Mysql-索引詳解 6. 索引優化 聯合索引的底層資料結構是怎麼樣的? 索引節點中,就會存儲多個字段的資料;然後資料節點中存儲其餘的字段資料。 比較大小:會一個一個字段進行比較,若第一個字段就能比較出大小,則不會進行後面字段的比較;是以,當我們使用索引時,若查詢的字段順序,不符合索引字段的順序,則無法使用索引。 eg: key(a, b, c); where b == 1 and a == 2 and c==1, 依然會被Mysql底層,優化使用到索引。除非,where中不含a開頭,就會無法使用索引。 Mysql-索引詳解