mysql索引
我想一想到mysql索引,大家可能都會想到b+樹之類的。但是不知道有沒有想過,為什麼需要用b+樹,如果是讓你來設計mysql的索引的資料結構,你又會如何來設計呢?
我可以想到的資料結構可能是hash表、有序陣列、樹等等。
首先來看hash表,hash表的優勢是等值查詢,當我們查詢某個值的時候可以在常數時間複雜度o(1)完成。所以查詢很快,但是hash表有個缺點,就是無法滿足範圍查詢,sql查詢還是會有很多範圍查詢的,所以這個可能就不太合適了。
再來看有序陣列,有序資料可以保證單個值查詢時間複雜度在o(log(n)),而且對範圍查詢也很友好,可以根據二分法查詢到值後,繼續往後遍歷就可以。但是有序陣列在資料更新的時候,會出現效能問題,因為更新的時候要保證整個資料還是有序的,所以需要進行陣列的資料搬移,這個過程會比較消耗效能。
那如果是用樹呢?如果用二叉樹,那麼可以讓更新和查詢都控制在o(log(n)),當然是在平衡二叉樹的情況下。除了二叉樹,還有多叉樹,由於mysql的資料是儲存的磁碟上面的,為了減少磁碟的io,就要減少數的高度,所以mysql就用了b+樹來構建索引。
再來講mysql索引,索引為了主鍵索引和非主鍵索引,主鍵索引也稱為cuzhusuoyin。(用了拼音 - -)
主鍵索引和非主鍵索引的區別是,主鍵索引儲存了表裡面的行,也就是儲存了所有的資料。非主鍵索引儲存的是主鍵索引的建值。
也就是說,用主鍵索引查詢需要遍歷一次主鍵索引。用非主鍵索引查詢資料,需要遍歷非主鍵索引,還有主鍵索引。需要遍歷兩次是因為,非主鍵所以沒有儲存資料,只儲存了主鍵索引的所以值,還需要根據這個索引值,在回到主鍵索引在做一次查詢,這個被稱為回表。所以非主鍵索引的查詢會比直接用主鍵索引的查詢來的慢。
還有值得一提的是,通常主鍵索引都是使用自增id,這又是為什麼呢?這是因為如果使用自增的id,那麼每次都是自增長,這樣資料就會比較緊湊。也是為了防止資料分頁合併帶來的效能損耗。
所以通常會使用自增id來做主鍵索引。
舉個例子:
上圖為主鍵id索引,當來了乙個主鍵id為600時,由於500和800剛好是乙個資料頁已經滿了,所以600來了就需要進行頁**,導致效能下降。
C 二分法查詢,遞迴二分法
用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...
python二分法查詢 Python 二分法查詢
二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...
二分法,二分搜尋
二分法是乙個應用很廣泛的演算法 好吧,剛說出這句話的時候,我查了一下資料,發現我了解的應用寥寥無幾.ok,既然不知道,那就下次補充把。咱們直接進入主題。二分法 bisection method 是一種方程式根的近似值求法。演算法 若要求已知函式f x 0的值則 1.先找出乙個區間 a,b 使得f a...