MySQL中的索引和鎖

2021-09-29 02:18:53 字數 1231 閱讀 8033

索引常見的幾種型別

索引常見的型別有雜湊索引,有序陣列索引,二叉樹索引,跳表等等。

在建表的時候我們可能會新增多個索引,而inndb會為每個索引建立乙個b+樹進行儲存索引,假如我們在建表的時候建立了乙個主鍵索引和普通索引,那麼這時候inndb會為我們建立兩個b+索引樹

乙個是主鍵的聚簇索引,另乙個是普通索引的輔助索引

輔助索引上面的葉子節點的值只是存了主鍵的值,而在主鍵的 聚簇索引 上的葉子節點才是存上了整個值

回表

什麼是回表?就是mysql在輔助索引上找到對應的主鍵值並通過主鍵值在聚簇索引上查詢所要的資料就叫回表

但在有時候我們查輔助索引的時候就已經滿足了我們需要查的資料,這個時候inndb就會進行乙個叫覆蓋索引的操作來提公升效率,減少回表

簡單來說,覆蓋索引就是當我們走輔助索引的時候能獲取到我們所需要的資料的時候不需要再次進行回表操作的操作。

全域性鎖

mysql提供了乙個加全域性讀鎖的方法,命令是flush tables with read lock (ftwrl)。你需要讓整個庫處於唯讀狀態的時候,可以使用這個命令,之後其他執行緒的以下語句會被阻塞:資料更新語句(資料的增刪改)、資料定義語句(包括建表、修改表結構等)和更新類事務的提交語句。

表鎖mdl元資料鎖,mdl鎖用來保證只有乙個執行緒能對該錶進行表結構更改

mdl分為 mdl寫鎖 和 mdl讀鎖,加鎖規則是這樣的

使用mdl的鎖的命令是:lock tables *** read/write;

這種鎖是一種處理併發的方式,但在inndb中常用的是行鎖

行鎖其實行鎖就是兩個鎖,寫鎖(排他鎖)和讀鎖(共享鎖)

但是行鎖會引起死鎖問題,此處需要注意

next-key鎖

mvcc 和行鎖是無法解決幻讀問題的,這個時候 innodb 使用了 乙個叫gap鎖(間隙鎖)的東西,它配合行鎖形成了next-key鎖,解決了幻讀的問題。

但是因為它的加鎖規則,又導致了擴大了一些加鎖範圍從而減少資料庫併發能力。具體的加鎖規則如下:

MySQL索引和鎖

索引和鎖可以讓查詢鎖定更少的行。如果你的查詢從不訪問那些不需要訪問的行,那麼就會鎖定更少的行,從兩個方面來看這對效能都有好處。首先,雖然innodb的行鎖效率很高,記憶體使用也很少,但是鎖定行的時候仍然會帶來額外的開銷,其次,鎖定超過需要的行會增加鎖競爭,並減少併發性。innodb只有在訪問行的時候...

mysql中的索引 事務 鎖

一 索引 什麼是索引?為什麼要有索引?索引相當於字典的音序表,如果要查某個字,如果不使用音序表,則需要從幾百頁中逐頁去查。索引在 mysql 中也叫做 鍵 是儲存引擎用於快速找到記錄的一種資料結構。索引對於良好的效能非常關鍵,尤其是當表中的資料量越來越大時,索引對於效能的影響愈發重要。索引優化應該是...

mysql鎖和索引關係

在平時我們用mysql的鎖時,一般剛接觸資料庫是很少考慮鎖的效率,一般只求到達防止併發的目的就可以了,但是隨著資料量的增大我們就會發現有很多sql我們已經寫的非常優化了,但是有時候還是很慢,很難找到原因,這時候我們就應該考慮一下是不是mysql的鎖在導致的。我們首先建立乙個新的資料表 這裡我們的主鍵...