Mysql 索引 & 鎖

Mysql索引在開發(fā)工作中經(jīng)常用到,在此總結(jié)一些關(guān)于mysql索引的一些學(xué)習(xí)筆記

1mysql索引的本質(zhì)是什么?

? ? mysql索引的本質(zhì)是分散存儲的數(shù)據(jù)結(jié)構(gòu)。索引達到的目的是為了快速檢索,檢索使用數(shù)據(jù)結(jié)構(gòu)達到快速檢索的目的。

2工作機制是什么?

? ? 按照相應(yīng)的key在某一種數(shù)據(jù)結(jié)構(gòu)中查找存儲的指針,去指針指向的地址獲取到相應(yīng)的數(shù)據(jù)。

3哪些數(shù)據(jù)結(jié)構(gòu)適合作為索引?

? ? 首先查詢效率要高,查詢效率高的數(shù)據(jù)結(jié)構(gòu)首選hash,查詢效率可以達到O(1),為什么呢?hash表的物理存儲就是一個數(shù)據(jù),我們根據(jù)key計算出數(shù)組下標(biāo),就可以在數(shù)組中快速找到需要的key和value。既然hash的查詢效率這么高,mysql索引是不是hash實現(xiàn)的呢?不是,mysql索引查詢效率只是其中一方面,還有一個重要的條件需要滿足,那就是支持范圍查詢。顯然這是hash所不支持的。

?找支持范圍查找的數(shù)據(jù)結(jié)構(gòu),包含二叉查找樹,二叉平衡樹,紅黑樹,B樹,B+樹。

?其中,二叉查找樹,查詢效率O(lg2n),支持范圍查詢;mysql大部分數(shù)據(jù)插入按照主鍵自增的方式,這種插入方式使得二叉查找樹退化為了鏈表的形式。

?這種結(jié)構(gòu)在查詢的時候效率會大大被降低;二叉查找樹能夠退化成鏈表,選擇能夠自動平衡的樹呢?紅黑樹,可以自身調(diào)節(jié)進行二叉樹的平衡,但紅黑樹也有 右傾的可能,降低查詢效率。

AVL樹,可以避免上面所列數(shù)據(jù)結(jié)構(gòu)所出現(xiàn)的缺點;AVL要作為mysql索引,缺點體現(xiàn)在哪方面呢?一是樹高的問題,mysql索引是存儲在磁盤上的,每獲取一次節(jié)點就要進行一次磁盤IO操作。對于mysql來說,磁盤io是其性能瓶頸,所以獲取數(shù)據(jù)要盡可能少地進行磁盤io。二是一個節(jié)點存儲一個數(shù)據(jù),而內(nèi)存每次磁盤IO獲取的數(shù)據(jù)是以頁為單位(4kb),這樣每次獲取4kb數(shù)據(jù),使用的到卻很少,造成了一種浪費。沒有利用好系統(tǒng)和磁盤的交互特性

從innodb索引結(jié)構(gòu)分析, 為什么索引的key長度不能太長?

? ? key太長會導(dǎo)致一個頁當(dāng)中能夠存放的key的數(shù)目變少,間接導(dǎo)致索引樹的頁數(shù)目變多,索引層次增加,從而影響整體查詢變更的效率。

聚集索引和非聚集索引

????聚集索引是主鍵索引,非聚集索引是非主鍵創(chuàng)建的索引;聚集索引葉子節(jié)點存儲的是表中的數(shù)據(jù),非聚集索引葉子節(jié)點存放的是主鍵和索引列,使用非聚集索引查詢數(shù)據(jù)時,拿到主鍵再去主鍵索引上查找想要查詢的數(shù)據(jù)。


按照鎖的粒度進行分類,分為兩大類:

表鎖:

????鎖的粒度大,發(fā)生沖突概率高,并發(fā)度低,加鎖快,開銷小。

行鎖:

????鎖的粒度小,發(fā)送沖突概率低,并發(fā)度高,加鎖慢,開銷大。

Innodb行鎖表鎖都支持,MyISAM只支持表鎖;Innodb通過索引條件時使用行級鎖,否則使用表鎖。

表鎖分為兩種模式:表讀鎖,表寫鎖;總結(jié)為 讀讀不阻塞,讀寫阻塞,寫寫阻塞。

Innodb實現(xiàn)的行鎖:

共享鎖(S鎖):

????允許一個事務(wù)去讀一行,阻止其他事務(wù)獲得相同數(shù)據(jù)集的排他鎖;也叫做讀鎖:讀鎖是共享的,多個客戶可以同時讀取同一個資源,但不允許其他客戶修改。

排他鎖(X鎖):

????允許獲得排他鎖的事務(wù)更新數(shù)據(jù),阻止其他事務(wù)取得相同數(shù)據(jù)集的共享讀鎖和排他寫鎖。也叫做寫鎖:寫鎖是排他的,寫鎖會阻塞其他的寫鎖和讀鎖?。

悲觀鎖:????

????select語句后加了for update 相當(dāng)于加了排它鎖,其他的事務(wù)就不能對它修改了,需要等待當(dāng)前事務(wù)修改完后才能修改。? ??

樂觀鎖:

????樂觀鎖不是數(shù)據(jù)庫層面上的鎖,需要自己手動去加的鎖,本身不對數(shù)據(jù)加鎖而是通過業(yè)務(wù)實現(xiàn)加鎖的功能。

死鎖:

????并發(fā)情況下少不了死鎖,死鎖無法完全避免,可以盡量通過一些操作避免死鎖:

????為表添加合理的索引:不走索引,會為每一行記錄添加上鎖,死鎖概率增大。

? ? 大事務(wù)拆?。捍笫聞?wù)更傾向于死鎖。

????降低隔離級別:業(yè)務(wù)允許,可以降低隔離級別。

? ? 固定順序訪問表:避免交叉等待鎖的情形。

?著作權(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ù)。

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