明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

mysql鎖與索引之間的聯(lián)系

[摘要]在平時(shí)我們用mysql的鎖時(shí),一般剛接觸數(shù)據(jù)庫是很少考慮鎖的效率,一般只求到達(dá)防止并發(fā)的目的就可以了,但是隨著數(shù)據(jù)量的增大我們就會發(fā)現(xiàn)有很多sql我們已經(jīng)寫的非常優(yōu)化了,但是有時(shí)候還是很慢,很難找到...
在平時(shí)我們用mysql的鎖時(shí),一般剛接觸數(shù)據(jù)庫是很少考慮鎖的效率,一般只求到達(dá)防止并發(fā)的目的就可以了,但是隨著數(shù)據(jù)量的增大我們就會發(fā)現(xiàn)有很多sql我們已經(jīng)寫的非常優(yōu)化了,但是有時(shí)候還是很慢,很難找到原因,這時(shí)候我們就應(yīng)該考慮一下是不是mysql的鎖在導(dǎo)致的。

我們首先建立一個(gè)新的數(shù)據(jù)表:

mysql鎖和索引之間的聯(lián)系

這里我們的主鍵默認(rèn)是有索引的;這邊加幾條數(shù)據(jù)

mysql鎖和索引之間的聯(lián)系

然后我們開兩個(gè)進(jìn)程進(jìn)行測試:

mysql鎖和索引之間的聯(lián)系

先加一個(gè)where條件沒有涉及到索引的鎖:

mysql鎖和索引之間的聯(lián)系

然后我們在第二個(gè)窗口進(jìn)行一個(gè)更新這一行的數(shù)據(jù),我們會發(fā)現(xiàn)這個(gè)操作會被卡著,

mysql鎖和索引之間的聯(lián)系

mysql鎖和索引之間的聯(lián)系

然后我們提交事務(wù)會發(fā)現(xiàn)第二個(gè)窗口的數(shù)據(jù)會立馬執(zhí)行,

從上面來看似乎沒有任何問題,這樣確實(shí)達(dá)到了我們想要的目的,但是你可以再加同樣的鎖,試著更新下其他的數(shù)據(jù)比如我下面執(zhí)行的數(shù)據(jù):mysql鎖和索引之間的聯(lián)系

上面的三種情況都是我用同樣的流程測試的,他們都會被卡住,這樣問題就來了,我們其實(shí)在鎖住name='測試姓名'的時(shí)候或許只是想鎖住id=133和id=134兩行,我們并不想鎖住135,136,137,但是這三行我們也訪問不了,因?yàn)槲覀兊逆i是一個(gè)表鎖,我們來試一下另一種用鎖時(shí)用到索引的情況:

mysql鎖和索引之間的聯(lián)系

上面用鎖時(shí)用到了索引,但是我們在更新數(shù)據(jù)時(shí)還是被卡住了;這里我們就會覺得索引其實(shí)也沒什么用,但是你遇到同樣的鎖,更新數(shù)據(jù)時(shí)也用到索引是可以看一下效果:

mysql鎖和索引之間的聯(lián)系

我們會發(fā)現(xiàn)這個(gè)沒有被鎖卡住,直接更新了;

下面總結(jié)一下:如果我們的鎖用到索引就是行鎖,如果沒有用到索引就是表鎖,但是我們操作的數(shù)據(jù)必須用到鎖才行;

下面我們來說一下為什么會這樣:

首先我們知道如果沒有建立索引的話我們在進(jìn)行數(shù)據(jù)選取或者定位的時(shí)候是通過全表掃描的形式來進(jìn)行的,這樣就會形成表鎖,要是有索引的話就會直接定位到指定的行,就是形成行鎖,但是要注意你在更新數(shù)據(jù)是假如沒用到索引也會全表掃描,當(dāng)掃到被鎖的這一行是也會被鎖住,所以達(dá)不到想要的效果;

相關(guān)推薦:

mysql的鎖機(jī)制_MySQL

MySQL鎖的用法之表級鎖

如何實(shí)現(xiàn)MySQL鎖的優(yōu)化

以上就是mysql鎖和索引之間的聯(lián)系的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門到精通的SQL知識。