發布時間:2024-01-24閱讀(11)
首先我們先看幾個問題:(答案在文章尾)
1、存儲引擎是基于數據庫還是表的?
2、聚集(簇)索引和非聚集(簇)索引的區別是什么?
3、為什么建議InnoDB表必須建主鍵,并且推薦使用整型的自增主鍵?
4、為什么非主鍵索引結構葉子節點存儲的是主鍵值?
索引的本質是什么?索引是幫助MySQL高效獲取數據的、排好序的數據結構。
數據結構這里推薦一個網站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

網址樣式
1、二叉樹:索引有序時會產生鏈表。

二叉樹-索引有序時會產生鏈表
2、紅黑樹:高度不可控,使用時多次磁盤IO (從根節點找到9,進行4次磁盤IO)
3、Hash:
1)、對索引key進行一次hash運算就可以定位出數據存儲的位置
2)、很多時候Hash索引比B 樹效率更高
3)、僅能滿足“=”,“IN”,無法支持范圍查詢。所以99.9%都不是Hash索引
4)、會產生Hash沖突
4、B Tree:
1)、葉節點具有相同的深度,葉節點的指針為空
2)、所有索引元素不重復
3)、節點中的數據索引從左到右遞增排列(有序)

5、B Tree:MySQL使用B Tree作為索引的數據結構。(從根節點找到9,進行3次磁盤IO)
1)、非葉節點不存儲data,只存儲索引,可以放更多的索引。
2)、葉節點包含所有索引字段。
3)、葉子節點用指針鏈接,提高區間訪問的性能。
4)、數據索引遞增。

B Tree
熟悉完數據結構,下面看一下存儲引擎
MyISAM存儲引擎索引實現MyISAM的索引文件和數據文件是分離的 – 非聚集(簇)索引

MyISAM存儲引擎
葉子節點保存的data是數據所在行的磁盤文件地址,查找時,經過索引找到磁盤文件地址,根據地址可以直接去數據文件取出數據(回表)。
InnoDB存儲引擎索引實現表數據文件本身就是按B Tree組織的一個索引結構文件 --聚集(簇)索引
主鍵索引的數據結構:

葉子節點保存的data即是表中的數據,查找時,找到目標索引后可直接取出數據。
二級索引的數據結構:

葉子節點保存的data的主鍵id,通過二級索引定位主鍵id,如果索引列包含查詢列,可以直接取出數據。否則通過主鍵id在主鍵索引中取出數據(回表)。
聯合索引:

聯合索引是二級索引的一種,按照索引順序排序。
問題:1、存儲引擎是基于數據庫還是表的?
基于數據庫表的,在我們創建表時,可指定存儲引擎。
2、聚集(簇)索引和非聚集(簇)索引的區別是什么?
只需要記住一點,聚集(簇)索引的頁節點包含完整的數據記錄。
3、為什么建議InnoDB表必須建主鍵,并且推薦使用整型的自增主鍵?
如果設置了主鍵,那么InnoDB會選擇主鍵作為聚集索引。如果沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作為主鍵索引。如果也沒有這樣的唯一索引,則InnoDB會選擇內置6字節長的ROWID(遞增)作為隱含的聚集索引。(我們能做的,就不麻煩MySQL)
使用自增主鍵的好處是每次插入新的記錄,記錄就會順序添加到當前索引節點的后續位置,主鍵的順序按照數據記錄的插入順序排列,自動有序。當一頁寫滿,就會自動開辟一個新的頁。如果無序的話要頻繁地調整數據接口。
4、為什么非主鍵索引結構葉子節點存儲的是主鍵值?
節省內存空間、一致性。
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖