1.2Mysql的索引介紹以及鎖機制

索引

索引的物理文件存儲位置

對于innodb,文件有idb,frm. 索引以及數(shù)據(jù)存儲位置在于idb文件中,frm為表結(jié)構(gòu)。對于myisam,索引存儲位置在myi文件中。myd為數(shù)據(jù),frm為結(jié)構(gòu).

BTree與B+Tree

BTree和B+Tree都是通過二叉樹而演變過來的,二叉樹=>平衡二叉樹=>B+Tree
為什么選擇使用B+Tree
二叉樹:由于二叉樹每個節(jié)點最多只有2個子節(jié)點,高度高,搜索時間復(fù)雜度O(1)到O(logn),磁盤IO次數(shù)多
BTree:高度降低,但對于范圍查找磁盤IO次數(shù)依然多。
Hash:Hash樹定位某條非???,但由于是無序的,如果是范圍查詢,那么效率很低。而且如果索引值有重復(fù),如果重復(fù),只有全表掃描,會引發(fā)hash沖突。
紅黑樹:樹的高度隨數(shù)據(jù)的增加而增加,IO次數(shù)多
B+Tree:只有葉子節(jié)點才會有數(shù)據(jù),非葉子節(jié)點只有key,并且增加了相鄰節(jié)點之間的指向的指針,這樣所有的數(shù)據(jù)都會形成一個有序的鏈表,提高了區(qū)間訪問的性能(比如找18-30的數(shù)據(jù),找到18后,按序往后查找即可,不需要重新返回父節(jié)點進行查找)。既然要提升索引效率,因為內(nèi)存讀取運算速度遠遠大于磁盤的運行查找速度,所以磁盤的IO次數(shù)越少那么效率也就越高,所以B+樹最適合Mysql的索引。

聚簇索引(主鍵索引)和非聚簇索引

索引可以分為聚簇(聚集)索引和非聚簇索引。聚簇索引就是葉子節(jié)點存儲行數(shù)據(jù),而非聚簇索引葉子節(jié)點數(shù)據(jù)存儲的非行數(shù)據(jù)(例如Myisam葉子結(jié)點存儲的是行數(shù)據(jù)的物理地址),查到葉子節(jié)點后還需要去主鍵索引表中查到對應(yīng)的數(shù)據(jù)信息進行回表查詢。

主鍵索引/唯一索引/聯(lián)合索引

主鍵索引:一張表只允許又一個主鍵索引且不能為null
唯一索引:數(shù)據(jù)列不允許重復(fù)但允許為null的索引列叫唯一索引(非聚簇索引)
聯(lián)合索引:允許多個字段一起建立的索引叫聯(lián)合索引

索引的最左原則以及優(yōu)化
  • 聯(lián)合索引在搜索時滿足最左原則,比如聯(lián)合索引是abc,那么能觸發(fā)聯(lián)合索引的是a|ab|abc的搜索查詢.
  • 聯(lián)合索引失效原理:例如字段(a,b)。那么B+Tree是先排序a,在a的基礎(chǔ)上對b再進行排序存儲節(jié)點。所以如果只查詢b,那么在沒有a排序的基礎(chǔ)上,b是無序的也就沒有使用到索引。同理如果like "123%"使用了索引,like "%123"未使用索引。
  • 因為mysql有優(yōu)化器,所以無論我們寫where a and c and b 還是怎樣都可以用到索引表。索引在遇到(> < bewteen)時會停止匹配. where a= and b like 和 where b like and a= 效果都是一樣的,因為mysql優(yōu)化器會進行優(yōu)化。

樂觀鎖與悲觀鎖

什么是死鎖

兩個事務(wù)爭搶資源而互相等待,若無外力作用無法繼續(xù)向下執(zhí)行,此時我們就叫做死鎖。
innodb默認有個wait_timeout超時時間(50s)設(shè)置,如果事務(wù)超時則會自動回滾放棄資源。以此解決死鎖問題。

排他鎖

某行獲取到排他鎖后,其他事務(wù)無法對此行添加任何鎖,不能讀不能寫。

共享鎖

某行獲取到共享鎖后,其他事務(wù)可以讀不能寫,但無法添加排他鎖。

MVCC(樂觀鎖實現(xiàn)的方式之一)

多版本并發(fā)控制,在RR級別下使用MVCC去解決了臟讀/不可重復(fù)讀的問題。MVCC使用undolog實現(xiàn)版本鏈,通過ReadView對象以一定規(guī)則實現(xiàn)MVCC

悲觀鎖

添加X鎖實現(xiàn)悲觀鎖,讓其他事務(wù)進行鎖等待

間隙鎖

當(dāng)我們用范圍條件,例如id>1 and id<9 則會對1-9所有行數(shù)據(jù)加鎖,如果當(dāng)前表沒有id=2這個數(shù)據(jù),那么也會被鎖住,這個鎖就叫間隙鎖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容