《土豆乾貨》Mysql索引底層原理

2021-10-01 07:24:40 字數 2185 閱讀 5956

一、mysql的儲存引擎:myisam和innodb

1、innodb

這是mysql 5.5或更高版本的預設儲存引擎。它提供了事務安全(acid相容)表,支援外來鍵引用完整性約束。它支援提交、回滾和緊急恢復功能來保護資料。它還支援行級鎖定。當在多使用者環境中使用時,它的「一致非鎖定讀取」提高了效能。它將資料儲存在集群索引中,從而減少了基於主鍵的查詢的i/o。

2、myisam

該儲存引擎管理非事務性表,提供高速儲存和檢索,支援全文搜尋。

注意:儲存引擎不是針對於資料庫的,是針對於表的。在mysql5.5以上的版本中,同樣可以建立以myisam為儲存引擎的表。大多數情況下,我們使用的表都是innodb儲存引擎,所以以下均針對於以innodb為儲存引擎的表。

二、索引

1、unique 唯一索引

唯一索引,不允許具有索引值相同的行,從而禁止重複的索引或鍵值。系統在建立該索引時檢查是否有重複的鍵值,並在每次使用 insert 或 update 語句新增資料時進行檢查。該索引除提高查詢速度這一任務外,往往被用來作為資料唯一性的約束。注意,該索引在插入和更新時,會先查詢該表中師傅存在重複值,也就是說,會對表先加s鎖,後加x鎖。如果其他操作剛好在s鎖後,加了x鎖,就會造成死鎖。這種情況的死鎖innodb引擎會選擇代價較小的操作回滾。建議:當無唯一性約束要求時,使用普通索引。

2、normal 普通索引

普通索引的唯一任務為:提高查詢速度。·大部分情況下,普通索引是可以滿足要求的。

3、主鍵索引

必須為主鍵欄位建立乙個索引,這個索引就是所謂的「主索引」。主索引與唯一索引的唯一區別是:前者在定義時使用的關鍵字是primary而不是unique。(innodb表中在沒有預設主鍵的情況下會生成乙個6byte空間的自動增長主鍵。當在表裡設定了主鍵之後,_rowid就是對應主鍵,該主鍵只對mysql內部可見。即哪怕表中無主鍵,同時對一張表進行插入,也會出現auto_inc鎖)。

三、索引型別

索引型別分為btree以及hash(建立索引時的索引方式)

1、btree

btree結構的索引在底層資料結構上的選擇為b+樹。這裡有b+樹的一些性質。這種資料結構就導致了作為索引的字段最好不要出現以下情況:

1)重複。索引key重複會降低查詢效能

2)key值插入順序不規則。例如,已經存在的key為1,3,8.此時如果在插入4,很有可能會造成索引b+樹的結構變化,需要更長的時間去維護索引樹

3)key值過長。正常情況下,索引b+樹深度最大為3。根節點存於mysql為其劃分的記憶體中。當key值過長,根節點超出了記憶體大小時,b+樹深度就會+1,如此迴圈。b+樹深度每+1,查詢時就會增加一次i/o操作,效能大幅度下降。

4)表中資料過多同上,三層b+樹一般可以儲存2100萬資料多一點。如果超出了這個資料量,索引樹深度也會增加。這也是單錶資料量達到兩千萬被建議分表的原因。

2、hash

hash結構的索引工作原因為hash演算法。將key進行hash運算,所得到的值,根據hash表儲存到相應的磁碟模組中。當獲取時,同樣根據hash運算得到位置,一次i/o即可取出資料。針對於單key的資料查詢,這種索引型別是比btree更快的。但是其缺點為,範圍查詢效能極低。當且僅當該字段只會被用於=查詢時,建議使用該型別索引。實際上這種場景少之又少,所以hash結構的索引比較少見。

四、執行計畫

每一條sql執行前,建議使用explain觀察其執行計畫。explain執行計畫可以觀察sql執行檢索型別、可能用到的索引型別。實際用到的索引型別、索引key長度、檢索的索引行數、其他排序方式。其中有三處尤為需要注意。

1、type為all。該欄位含義為該sql所執行的查詢方式。all代表著全表查詢。如果不需要全部的表資料,全表查詢一定要避免。

2、key為null。該欄位含義為該sql使用的索引。為null代表著不使用索引。這種情況,type基本上都是all,也就是全表查詢。如果該查詢語句不是快照讀的話,會鎖全表。而且效能極差。必要的時可以使用force index(索引名稱)強制指定索引。

3、extra出現filesort。該欄位出現filesort,一般原因為sql語句**現了order by。filesort代表著使用了記憶體或磁碟排序,這種排序方式很慢而且耗費機器效能。建議避免這種情況。order by排序字段最好為索引字段(索引方式要為btree)。根據b+樹結構可知,索引樹的位置本身就是有順序的,排序其實就是按順序輸出就可以。

MySQL索引底層(二) 索引底層原理

聚集索引 上次我們講到了主鍵的索引,我們可以執行一下sql語句 explain select from t user where a 1 我們可以看到這條sql走的是主鍵的索引,而在mysql的innodb中,主鍵索引則是聚集索引,資料的物理順序與鍵值的邏輯 索引 順序相同,其實就是說主鍵索引跟其他...

MySQL索引底層原理

通過hash演算法,能快速檢索資料 資料碰撞問題用鏈位址法 無法進行範圍搜尋 解決雜湊索引無法範圍搜尋的問題 極端情況下會退化成線性鍊錶,自增主鍵必然會導致極端情況 會自動調整樹形態,使其保持平衡,調整會消耗效能 無法完全解決二叉查詢樹的問題 絕對平衡的二叉樹,更耗效能 根本解決了紅黑數的問題 由於...

mysql索引底層原理

索引的本質 資料結構 組織資料的方式 innodb沒有主鍵索引時,判斷是否含有唯一索引,沒有唯一就生成乙個隱藏的row id作為主鍵 在資料較少時是以鍊錶的形式儲存資料的,當資料過多,長鍊表會影響資料的查詢,此時會將資料通過頁的形式進行儲存,預設一頁儲存16kb資料,每頁會與每頁之間通過指標進行連線...