一、索引的概述與分類
什麼是索引?
mysql官方定義:
索引是(index)是幫助的mysql高效獲取資料的資料結構,我們可以理解為快速查詢排好序的一種資料結構。
索引類似於圖書的目錄索引,可以提高檢索的效率,降低資料庫的io成本。
索引的分類:
總結:索引就像是一本書的目錄是為了提高檢索的速度。
在mysql中有不同的索引型別,要求和效率也不一樣
二、索引原理-索引與b+tree
雜湊索引
b+tree索引
只有menory(記憶體) 儲存引擎支援雜湊索引,雜湊索引用索隱裂的值計算該值的hashcode,然後在hashcode相應的位置存該值所在行資料的物理位置,因為使用雜湊演算法,因此訪問速度非常快,但是只能乙個值只能對應乙個hashcode,而且是雜湊的分布方式,因此雜湊索引不支援範圍查詢和排序的功能。正藏情況下,如果不指定索引,那麼一般是指b+tree索引(或者b+t tree索引)。
儲存引擎以不同的方式使用b+tree索引。效能也各有不同,但是innodb按照原資料格式進行儲存。
b+tree 就是b+樹,而b+tree就是通過b樹演變過來的,所以想知道什麼是b+樹,那麼就要了解什麼是b樹,要了解b樹呢就得知道二叉樹,這些都是資料結構的內容,那麼資料結構是啥呢?資料結構是計算機儲存。組織資料的方式。資料結構是指相互之間存在一種或者多種特定關係的資料元素的集合。通常情況下,精心選擇的資料結構可以帶來更高的執行或儲存效率。資料結構往往同更高效的檢索演算法和索引技術有關。
順序查詢:就是從第乙個元素開始,按索引順序遍歷待查詢序列,直到找出給定目標或查詢失敗
缺點:效率低–需要遍歷整個待查序列
二分查詢:也稱為折半查詢,是一種在有序陣列中查詢特定元素的搜尋演算法。
二叉樹也存在缺點,就是當資料是順序插入時就會改變樹的形態(在非完全二叉樹的時候)
平衡二叉樹經過條件的控制,在通過旋轉的方式,完成樹的平衡,不過,旋轉次數過多。
紅黑樹在平衡二叉樹穩定性下的基礎上,在優化一下,減少旋轉次數,保證樹的平衡性。樹的查詢效能,取決於樹的高度,讓樹盡可能平衡,就是為了降低樹的高度。
當資料存在記憶體中,紅黑樹效率非常高,但是檔案系統和資料庫都是存在硬碟上的,如果資料量大的話,不一定能一次性載入到記憶體。
所以一棵樹都無法一次性載入到記憶體,又如何談查詢。因此就出現了專為磁碟等儲存裝置而設計的一種平衡多路查詢樹,也就是b樹 ,與紅黑樹相比,在相同的節點的情況下,一顆b/b+樹的高度遠遠小於紅黑樹的高度。
b樹即平衡查詢樹,一般理解為平衡多路查詢樹,也稱為b-樹、b_樹。
b樹是一種自平衡樹狀資料結構,一般較多用於儲存系統上,比如資料庫或檔案系統。
1、磁碟讀寫代價更低
b樹的資料和索引都在同乙個節點上,那麼每個塊中包含的索引是少量的,如果想要取出比較深層的資料,意味著要讀取更多的塊,才能得到更多的索引和資料,那麼就增加了io次數。
而b+樹每個塊中儲存的索引是b樹的很多倍,那麼獲取比較深層的資料,也只需要讀取少量的塊就可以,那麼減少了磁碟的io次數。
2、隨機io的次數更少
隨機 i/o 是指讀寫操作時間連續,但是訪問位址不連續,時長約為10ms。
順序 i/o 是指讀取和寫入操作基於邏輯塊逐個連續訪問來自相鄰位址的資料,時長約為0.1ms
相同情況下,b樹要進行更多的隨機i/o,而b+樹需要更多的順序i/o,因此b+樹,效率也更快。
3、查詢速度穩定
由於b+tree非葉子節點不儲存資料(data),因此所有的資料都要查詢至葉子節點,而葉子節點的高度是相同的,因此所有資料的查詢速度是一樣的。
總結:資料庫中,索引是為了提高資料的檢索速度的,而索引是基於b+tree的資料結構實現的。
而使用b+tree的好處是:
1、降低了磁碟讀寫代價。
2、順序i/o提高效率
3、查詢速度更穩定。
聚簇索引 和非聚簇索引
索引分聚簇索引和非聚簇索引兩種。
在索引的分類中,我們可以按照索引的主鍵來分為「主索引」和「輔助索引」
使用主鍵鍵值建立的索引稱為「主索引」,其他的稱為「輔助索引」。
因此索引只能有乙個,輔助索引可以有很多個。
聚簇索引:索引即資料,資料即索引。
非聚簇索引:找到索引僅僅是找到的當前索引值和key值如果需要索引外的內容,則需要回表。
以上都以innodb表引擎為基礎
myisam和innodb的區別
資料儲存方式:
innodb有兩種檔案組成,表結構,資料和索引
myisam有三種檔案組成,表結構、資料、索引
索引的方式:
索引的底層都是基於b+tree的資料結構建立
innodb中主鍵索引為聚簇索引,輔助索引是非聚簇索引
事務的支援:
innodb支援事務
myisam不支援事務
三、慢查詢與優化
mysql的慢查詢。全名是慢查詢日誌,是mysql提供的一種日誌記錄,用來記錄在mysql中相應時間超過閾值的語句。預設情況下,mysql資料庫並不啟動慢查詢日誌,需要手動來設定這個引數。如果不是調優需要的話,一般不建議啟動該引數,開啟慢查詢日誌或多或少帶來一定的效能影響。
未完待續…
MySQL 索引與查詢優化
本文介紹一些優化 mysql 索引設計和查詢的建議。在進行優化工作前,請務必了解mysql explain命令 檢視執行計畫 索引在邏輯上是指從索引列 關鍵字 到資料的對映,通過索引可以快速的由關鍵字查詢到資料記錄。順序查詢複雜度為o n 樹狀索引查詢複雜度為o logn 雜湊索引為o 1 mysq...
MySQL索引型別與優化
索引優化 參考資料 在mysql中,索引是在儲存引擎層而不是伺服器層實現的,所以不同的儲存引擎的索引型別和實現不同。大多數儲存引擎都使用b tree作為預設索引型別,但實際在技術上往往使用的是b tree,例如innodb。b tree索引之能夠加快訪問資料的速度,是因為儲存引擎不再需要進行全表掃瞄...
mysql 優化 聚集索引 mysql 索引優化
一.聚集索引 clustered index innodb預設依據主鍵列聚集,myisam不使用 特點 b樹每個葉子包含實際資料行,資料按照索引順序地儲存在物理頁上。優點 1.範圍查詢,獲取指定id的全部資料只需從磁碟讀取少量資料頁 如果不使用聚集索引,每條資料可能引起一次磁碟io。2.由於索引和資...