mysql官方對索引定義:是儲存引擎用於快速查詢記錄的一種資料結構。需要額外開闢空間和資料維護工作。
索引是物理資料頁儲存,在資料檔案中(innodb,ibd檔案),利用資料頁(page)儲存。
索引可以加快檢索速度,但是同時也會降低增刪改操作速度,索引維護需要代價。
索引涉及的理論知識:二分查詢法、hash和b+tree。
二分查詢法也叫作折半查詢法,它是在有序陣列中查詢指定資料的搜尋演算法。它的優點是等值查詢、範圍查詢效能優秀,缺點是更新資料、新增資料、刪除資料維護成本高。
首先定位left和right兩個指標
計算(left+right)/2
判斷除2後索引位置值與目標值的大小比對
索引位置值大於目標值就-
1,right移動;如果小於目標值就+
1,left移動
舉個例子,下面的有序陣列有17 個值,查詢的目標值是7,過程如下:
第一次查詢
第二次查詢
第三次查詢
第四次查詢
hash底層實現是由hash表來實現的,是根據鍵值 儲存資料的結構。非常適合根據key查詢value值,也就是單個key查詢,或者說等值查詢。其結構如下所示:
從上面結構可以看出,hash索引可以方便的提供等值查詢,但是對於範圍查詢就需要全表掃瞄了。hash索引在mysql 中hash結構主要應用在memory原生的hash索引 、innodb 自適應雜湊索引。
innodb提供的自適應雜湊索引功能強大,接下來重點描述下innodb 自適應雜湊索引。
innodb自適應雜湊索引是為了提公升查詢效率,innodb儲存引擎會監控表上各個索引頁的查詢,當innodb注意到某些索引值訪問非常頻繁時,會在記憶體中基於b+tree索引再建立乙個雜湊索引,使得記憶體中的 b+tree 索引具備雜湊索引的功能,即能夠快速定值訪問頻繁訪問的索引頁。
innodb自適應雜湊索引:在使用hash索引訪問時,一次性查詢就能定位資料,等值查詢效率要優於b+tree。
自適應雜湊索引的建立使得innodb儲存引擎能自動根據索引頁訪問的頻率和模式自動地為某些熱點頁
建立雜湊索引來加速訪問。另外innodb自適應雜湊索引的功能,使用者只能選擇開啟或關閉功能,無法進行人工干涉。
show engine innodb status \g; show variables like '%innodb_adaptive%'
;
mysql資料庫索引採用的是b+tree結構,在b-tree結構上做了優化改造。
b-tree結構
索引值和data資料分布在整棵樹結構中
每個節點可以存放多個索引值及對應的data資料
樹節點中的多個索引值從左到右公升序排列
b樹的搜尋:從根節點開始,對節點內的索引值序列採用二分法查詢,如果命中就結束查詢。沒有命中會進入子節點重複查詢過程,直到所對應的的節點指標為空,或已經是葉子節點了才結束。
b+tree結構
非葉子節點不儲存data資料,只儲存索引值,這樣便於儲存更多的索引值
葉子節點包含了所有的索引值和data資料
葉子節點用指標連線,提高區間的訪問效能
相比b樹,b+樹進行範圍查詢時,只需要查詢定位兩個節點的索引值,然後利用葉子節點的指標進行遍歷即可。而b樹需要遍歷範圍內所有的節點和資料,顯然b+tree效率高。
聚簇索引和非聚簇索引:b+tree的葉子節點存放主鍵索引值和行記錄就屬於聚簇索引;如果索引值和行記錄分開存放就屬於非聚簇索引。
主鍵索引和輔助索引:b+tree的葉子節點存放的是主鍵字段值就屬於主鍵索引;如果存放的是非主鍵值
就屬於輔助索引(二級索引)。
在innodb引擎中,主鍵索引採用的就是聚簇索引結構儲存。
聚簇索引(聚集索引)
聚簇索引是一種資料儲存方式,innodb的聚簇索引就是按照主鍵順序構建 b+tree結構。b+tree的葉子節點就是行記錄,行記錄和主鍵值緊湊地儲存在一起。 這也意味著 innodb 的主鍵索引就是資料表本身,它按主鍵順序存放了整張表的資料,占用的空間就是整個表資料量的大小。通常說的主鍵索引就是聚集索引。
innodb的表要求必須要有聚簇索引:
如果表定義了主鍵,則主鍵索引就是聚簇索引
如果表沒有定義主鍵,則第乙個非空unique列作為聚簇索引
否則innodb會從建乙個隱藏的row-id作為聚簇索引
輔助索引innodb輔助索引,也叫作二級索引,是根據索引列構建 b+tree結構。但在 b+tree 的葉子節點中只存了索引列和主鍵的資訊。二級索引占用的空間會比聚簇索引小很多, 通常建立輔助索引就是為了提公升查詢效率。乙個表innodb只能建立乙個聚簇索引,但可以建立多個輔助索引。
非聚簇索引
與innodb表儲存不同,myisam資料表的索引檔案和資料檔案是分開的,被稱為非聚簇索引結構
必須掌握 MySQL查詢優化
開啟慢查詢日誌 檢視 mysql 資料庫是否開啟了慢查詢日誌和慢查詢日誌檔案的儲存位置的命令如下 show variables like slow query log 通過如下命令開啟慢查詢日誌 set global slow query log on set global slow query l...
必須掌握的13個MySQL索引知識點
問題1 什麼是資料庫索引?資料庫索引是資料庫系統中乙個重要的概念,索引也叫做 key 是一種用於提公升資料庫查詢效率的資料結構,我們可以把索引理解成一本書的目錄,通過目錄我們可以快速找到對應章節的內容,同樣的,通過資料庫索引,我們可以快速找到資料表中對應的記錄。總而言之,索引就像給資料表建了乙個目錄...
MySQL索引原理之索引原理
索引定義 是儲存引擎用於快速查詢記錄的一種資料結構。需要額外開闢空間和資料維護工作。索引是物理資料頁儲存,在資料檔案中 innodb,ibd檔案 利用資料頁 page 儲存。索引可以加快檢索速度,但是同時也會降低增刪改操作速度,索引維護需要代價。索引涉及的理論知識 二分查詢法 hash和b tree...