1.什麼是b+tree
2.b+tree在兩大引擎下的體現形式
3.理解幾大索引原則
推薦乙個資料結構視覺化的**:
在參與開發的第乙個專案中,有乙個特別嚴重的問題就是mysql的sql優化,sql優化的基礎就是索引,我發現我根本沒有理解mysql的索引,所以我重新學習了一下索引。
索引是為了加速對錶中資料行的檢索而建立的一種分散儲存的資料結構。
上面是一張資料庫表和它的索引,索引是為了什麼呢,就是為了快速通過id來查詢資料所在的磁碟位址得到資料並返回。
以上是二叉查詢樹的結構,這個資料結構會一直往下延伸,這個資料結構不大符合要求,為什麼不大符合呢?請往下看:
以上是改進的資料結構,叫平衡二叉樹,二叉樹的形成過程如何呢,請去上面提供的**檢視
為什麼平衡二叉樹還是不符合資料庫的需求呢,原因如下:
1、它太深了:資料處的深度決定著它的io操作次數,io操作耗時大
2、它太小了:每個磁碟快儲存的資料量太小了,資料量太小就不會很好的利用作業系統和磁碟的資料交換特性(一般一次交換是4k)
也沒有利用好磁碟的io預讀能力(空間區域性性原理),從而帶來頻繁的io操作,什麼叫io預讀能力呢,就是每次載入資料,他都會載入臨近的資料,以減少io的操作次數
上面是b-tree,非常關鍵,說明一點17、35是什麼,這個就是索引的值,比如id做索引,17、35就是id的值
多路平衡查詢樹解決了平衡二叉樹什麼問題呢?
1、它太深的問題,我們可以提公升路(也就是p1、p2、p3),路數提公升了儲存的資料也就增多了,同樣是三層,多路平衡查詢樹儲存的資料絕對比上面的多,這樣就可以減少io操作了
mysql是採用加強版的平衡查詢樹,為什麼會選擇這種呢?先看一下兩者的區別:
為什麼掃庫、表能力更強?(不是非常理解)
(1)上層節點沒有儲存資料區,所以只需要掃葉子節點就行了
(2)葉子節點還是有序排序的
為什麼磁碟讀寫能力更強
(1)上層節點不儲存資料區,可以載入更多的資料,也就有更多的關鍵字,減少io操作
為什麼排序能力更強
葉子節點本身就有天然的排序功能
在myisam下不同索引的級別是一樣的。
在innodb下的索引是不一樣的,innodb非常重視主鍵,其它索引都是找到主鍵,然後通過主鍵索引找到資料的,所以這就是為什麼innodb推薦使用自增的主鍵,因為自增的主鍵在插入資料的時候主鍵的索引表的左邊是不需要變化的,最右邊才需要變化。這也是為什麼要做左閉合區間
1.在離散性高選擇性越好,btree才能更好的搜尋,離散性計算公式:count(distinct col)/count(col)
2.最左匹配原則,就是對索引中關鍵字進行對比,一定是從左往右,且不可跳過
上面的索引name上建立索引,就是重複索引,在增刪改就會效能降低,因為最左匹配原則,name是不可跳過的,所以建立下一種即可。
第一點:對,為什麼呢?
資料小,能載入的資料就多,載入的關鍵字就越多,可以減少io操作。
第二點:對,一張表索引越多,就會造成增刪改需要對索引表進行維護,增加效能的消耗
第三點:9999%這個可以,其它兩個不行,不滿足最左匹配原則
第四點:對,不等於索引是無法計算的
第五點:對,b+tree天然有序
第六點:對,返回想要的列,可以減少io操作
第七點:對,最左匹配原則
第八點:對,最左匹配原則
第九點:對,最左匹配原則
深入解析MySQL索引原理
一.什麼是索引 為什麼要建立索引?關於索引的理解,個人更加喜歡將其比喻為字典裡面的目錄,根據字典來進行查詢的速度遠大於每一頁逐個逐個字排查的速度。索引主要用於快速找出在某個列中有特定值的行,倘若不使用索引,mysql必須從第一條記錄開始讀完整個表,直到找出相關的行,表越大,查詢資料所花費的時間就越多...
MySQL 索引解析
如果a的x次方等於n a 0,且a不等於1 那麼數x叫做以a為底n的對數 logarithm 記作x logan 通過上面的分析,我們知道io次數取決於b 數的高度 h,假設當前資料表的資料為 n,每個磁碟塊的資料項的數量是 m,則有h m 1 n,當資料量n一定的情況下,m越大,h越小 而m 磁碟...
mysql 索引深入理解 深入理解MySql的索引
為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...