1,索引 在資料庫裡也可以叫作『鍵』 主鍵,唯一,普通索引。儲存引擎可以通過索引來快速查到記錄的一種資料結構,當表中的資料量越來越大的時候,索引的作用越發的重要
2,考慮到磁碟io是非常高昂的操作,計算機作業系統做了一些優化,當一次io時,不光把當前磁碟位址的資料,而是把相鄰的資料也都讀取到記憶體緩衝區內,因為區域性預讀性原理告訴我們,當計算機訪問乙個位址的資料的時候,與其相鄰的資料也會很快被訪問到。每一次io讀取的資料我們稱之為一頁(page)。具體一頁有多大資料跟作業系統有關,一般為4k或8k,也就是我們讀取一頁內的資料時候,實際上才發生了一次io,這個理論對於索引的資料結構設計非常有幫助。
3,索引分類
mysql 支援多種儲存引擎 每個儲存引擎使用的索引各不相同 大概有b+tree ,全文索引,hash索引
4,b-tree 和 b+tree區別
btree:平衡搜尋多叉樹 非葉子和葉子節點儲存key 已經data
b+tree 和b-tree區別在於:b+tree 非葉子節點只儲存key 葉子節點才儲存data
如上圖所示 淺藍色區域我們稱之為磁碟塊 ,每個磁碟塊包含幾個資料項(深藍色)和指標(黃色) 如:磁碟塊1包含 17 35資料項 還有p1 p2 p3三個指標 p1表示小於17的磁碟塊 p2 表示大於17小於35的磁碟塊 p3表示大於35的 真實的資料儲存在葉子節點 3 ,5,9,10,13,15,非葉子節點不存數真實資料
查詢過程:
如上圖所示,如果要想查詢資料項29 那麼首先會先將磁碟塊1載入到記憶體中,此時發生一次i/o,在記憶體中通過二分法迅速找到29在17和35之間,鎖定磁碟塊1的指標p2(記憶體查詢時間非常短的相對於磁碟查詢可忽略不計)通過磁碟塊1中的p2指標的磁碟位址將磁碟塊3由磁碟載入到記憶體中 發生第二次io29在26和30之間 鎖定p2指標,通過該指標將磁碟塊8載入到記憶體中 發生第三次io,記憶體中二分法查到到29 查詢over 總共三次io 3層的b+tree可以儲存幾百萬的資料量,上百萬的資料只需三次io 效能提公升是比較大的如果沒有索引 那麼要上百萬此io
從中我們能發現 樹的高度決定了磁碟io的次數,所以同樣的資料量的話 怎麼才能讓樹高度低呢,很顯然就是每塊磁碟塊儲存的資料量越大樹的高度越低
假設樹的高度h
表資料總量n
每個磁碟塊資料項是m
則有h=㏒(m+1)n n不變的話m越大 h越小 m = 磁碟塊的大小/資料項的大小 磁碟塊大小就是乙個資料頁的大小,是固定不變的 如果資料項佔的空間越小,那麼存的資料項數量就越多,樹的高度越低。這也是為什麼索引欄位要盡量的小 同樣的int(4)要比int(8)少一半 ,這也不難解釋為啥b+tree非葉子節點不存真實資料
索引的最左匹配特性(從左往右匹配):當使用了復合索引的時候 比如(name,age,phone) b+tree 時從左往右的順序來建立索引樹 當(jay ,12,18999999999)這樣的資料來檢索的時候 會優先比較name確定下一步的搜尋方向,如果name相同的話再比較age 和 phone。 但是如果是(12,189999999)這樣來檢索的時候 那麼btree就不知道下一步該查詢哪個節點,因為建立搜尋樹的時候name就是第乙個比較因子,必須要先根據name來搜尋判斷下一步的方向所有這就用不到索引了
如果(jay ,189999999)這樣的資料來搜尋時 會先用name來指定搜尋方向,但是age沒有 那麼只能把名字=jay 的所有資料都找到然後再匹配phone的資料
5,建立索引的原則
索引並不是越多越好,建立合適的索引才能起到好的效果
1,必須得符合最左匹配原則
2,盡量給那些離散度高的字段新增索引 count(distinct col)/count(*) 離散度高的比如姓名 ** 離散度低的不如性別 就兩種
如果離散度低的字段新增索引 查詢的時候 查詢優化器反而會認為走全表更加快
3,索引列不能參與計算
mysql 索引的理解
1.資料存放的順序和索引順序一致,可以把相關資料儲存在一起。例如實現電子郵箱時,可以根據使用者 id 來聚集資料,這樣只需要從磁碟讀取少數的資料頁就能獲取某個使用者的全部郵件。如果沒有使用聚簇索引,則每封郵件都可能導致一次磁碟 i o。2.資料訪問更快,聚簇索引將索引和資料儲存在同乙個b tree中...
MySQL理解索引 新增索引的原則
mysql理解索引 新增索引的原則 索引用於快速找出在某個列中有一特定值的行。不使用索引,mysql必須從第1條記錄開始然後讀完整個表直到找出相關的行,還需要考慮每次讀入資料頁的io開銷。而如果採取索引,則可以根據索引指向的頁以及記錄在頁中的位置,迅速地讀取目標頁進而獲取目標記錄。大多數情況下都 預...
mysql索引理解
說到mysql,很多面試官會問mysql的底層儲存結構,mysql的儲存引擎,什麼是聚簇索引之類的問題 我這邊就好好寫寫這些是什麼。首先mysql底層結構是啥,b tree。很多人都會說這個,然後呢這個是怎麼實現的,開始懵逼的,只能記得一些模稜兩可的答案,我這邊其實也差不多,基本屬於模模糊糊,看一遍...