天天看點

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

===============

Tips:在閱讀本文前,最好先閱讀 這篇(Mysql鎖機制--行鎖)文章~

在上篇文章中,我們看到InnoDB預設的行鎖可以使得操作不同行時不會産生互相影響、不會阻塞,進而很好的解決了多事務和并發的問題。但是,那得基于一個前提,即 Where 條件中使用上了索引;反之,如果沒有使用上索引,則是全表掃描、全部阻塞。本文就以實際例子來示範這種情景。

1 準備資料

1.1 建表

DROP TABLE IF EXISTS employee;

CREATE TABLE IF NOT EXISTS employee (

id INT PRIMARY KEY auto_increment,

name VARCHAR(40),

money INT

)ENGINE INNODB;

注意:ENGINE 是 INNODB(因為 InnoDB 才支援行鎖)

1.2 插入資料

INSERT INTO employee(name, money) VALUES('', 10000);

INSERT INTO employee(name, money) VALUES('', 10000);

提示:'1001' & '1002' 既是字元串,也是數字(後面會用到)

2 沒有建索引的情形

到現在為止,沒有顯示地為 Employee 表建立索引。

2.1 準備

還是老規矩,兩個會話(終端),左邊是白色背景的,右邊是黑色背景的,并且均設定 autocommit = 0

2.2 測試

2.2.1 在左側會話中執行更新

Sql 語句:

UPDATE employee SET money = money + 10000 WHERE name = '';

結果:

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

2.2.2 在右側會話中執行更新

Sql 語句:

UPDATE employee SET money = money + 5000 WHERE name = '';

結果:如下圖所示,更新操作被阻塞了!

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

2.2.3 在左側執行 COMMIT 指令

提示:執行的時候注意檢視右邊Sql語句執行情況的變化

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

2.2.4 右側的Sql語句正常執行了,耗時 18.19 秒

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

2.2.5 右側也執行一下送出

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

2.2.6 左側檢視一下資料

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

2.2.7 右側檢視一下資料

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

兩邊結果相同,且正确。

但問題是,左側操作的是 name = '1001' 記錄而右側操作的是 name = '1002' 記錄,右側還是被阻塞了,說明,左側的更新操作鎖住了全表!究其原因,是因為 name 字段上沒有索引!

2.3 結論

當 Where 查詢條件中的字段沒有索引時,更新操作會鎖住全表!

3 索引失效的情形

現在來示範索引失效的情形;要想索引失效,前提得要有索引啊;于是,先建立索引。

3.1 建立索引

CREATE INDEX idx_name ON employee(name);

3.2 有索引情況下的行鎖示範

提示:還是老規矩,兩個會話(終端),左邊是白色背景的,右邊是黑色背景的,并且均設定 autocommit = 0

3.2.1 在左側會話中執行更新

Sql 語句:

UPDATE employee SET money = money + 10000 WHERE name = '';

結果:

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

3.2.2 在右側會話中執行更新

Sql 語句:

UPDATE employee SET money = money + 5000 WHERE name = '';

結果:

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

立即執行,沒有被阻塞!

3.2.3 左右兩側分别執行送出

3.2.4 左側檢視結果

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

3.2.5 右側檢視結果

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

兩邊的結果相同,且正确。

3.2.6 結論

可以看到,在有索引的情況下,更新不同的行,InnoDB 預設的行鎖不會阻塞。

3.3 索引失效情況下的行鎖示範

提示:還是老規矩,兩個會話(終端),左邊是白色背景的,右邊是黑色背景的,并且均設定 autocommit = 0

3.3.1 在左側會話中執行更新

Sql 語句:(注意:name = 1001 的 1001 兩邊沒有加單引号)

UPDATE employee SET money = money + 10000 WHERE name = 1001;

結果:

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

3.3.2 在右側會話中執行更新

Sql 語句:

UPDATE employee SET money = money + 5000 WHERE name = '';

結果:

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

被阻塞!說明左側會話鎖住了整張表!

3.3.3 左側執行送出(注意檢視右側會話中Sql執行的情況變化)

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

3.3.4 檢視右側會話

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

右側會話中的更新操作被執行,耗時 20.68 秒

3.3.5 右側也送出

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

3.3.6 左側檢視結果

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

3.3.7 右側檢視結果

mysql行鎖索引問題_Mysql鎖機制--索引失效導緻行鎖變表鎖

兩邊結果相同,且正确。

3.3.8 結論

Where 條件中的查詢字段雖然有索引,但是索引失效時(本例子中是字元串沒有加單引号),InnoDB 預設的行鎖更新操作變為表鎖。

4 結論

沒有索引或者索引失效時,InnoDB 的行鎖變表鎖

原因:Mysql 的行鎖是通過索引實作的!

Mysql在InnoDB引擎下索引失效行級鎖變表鎖案例

先做好準備,建立InnoDB引擎資料表,并添加了相應的索引 DROP TABLE IF EXISTS `innodb_lock`; CREATE TABLE `innodb_lock` ( `a` ) ...

SQL優化 MySQL版 - 避免索引失效原則(一)

避免索引失效原則(一) 精力有限,剩餘的失效原則将會在 中連載出來,請諒解 作者 : Stanley 羅昊 [轉載請注明出處和署名,謝謝!] 避免索引失效的一些原 ...

SQL優化 MySQL版 - 避免索引失效原則(二)

避免索引失效原則(二) 注:繼上一篇文章繼續講解: 避免索引失效原則(一)https://www.cnblogs.com/StanleyBlogs/p/10482048.html#4195062 作者 ...

MySQL 行鎖 表鎖機制

MySQL 表鎖和行鎖機制 行鎖變表鎖,是福還是坑?如果你不清楚MySQL加鎖的原理,你會被它整的很慘!不知坑在何方?沒事,我來給你們标記幾個坑.遇到了可别亂踩.通過本章内容,帶你學習MySQL的行鎖 ...

[轉]MySQL 表鎖和行鎖機制

本文轉自:http://www.cnblogs.com/itdragon/p/8194622.html MySQL 表鎖和行鎖機制 行鎖變表鎖,是福還是坑?如果你不清楚MySQL加鎖的原理,你會被它整 ...

MySQL進階第四章——MySQL的鎖機制

一.概述 1.定義 鎖是計算機協調多個程序或線程并發通路某一資源的限制. 2.分類 操作類型來分: 讀鎖(共享鎖)和寫鎖(排它鎖) 資料粒度來分: 表鎖和行鎖 二.三鎖 1.表鎖——偏讀 特點: 偏向 ...

【資料庫】資料庫的鎖機制,MySQL中的行級鎖,表級鎖,頁級鎖

轉載:http://www.hollischuang.com/archives/914 資料庫的讀現象淺析中介紹過,在并發通路情況下,可能會出現髒讀.不可重複讀和幻讀等讀現象,為了應對這些問題,主流數 ...

mysql優化二之鎖機制

mysql優化二之鎖機制 mysql提供了鎖機制和MVCC機制來保證并發操作的安全性,這裡主要讨論鎖機制, MVCC見下篇文章 mysql的鎖按照鎖粒度可分為行鎖與表鎖,按照操作類型劃分可讀鎖和寫鎖 ...

MySQL進階學習筆記(六):MySql鎖機制

文章目錄 概述 定義 生活購物 鎖的分類 從對資料操作的類型(讀\寫)分 從對資料操作的粒度分 三鎖 表鎖(偏讀) 特點 案例分析 建表SQL 加讀鎖 加寫鎖 結論 如何分析表鎖定 行鎖(偏寫) 特點 ...

随機推薦

LinkedHashMap和HashMap的比較使用

由于現在項目中用到了LinkedHashMap,并不是太熟悉就到網上搜了一下. import java.util.HashMap; import java.util.Iterator; import ...

unity3d web.config設定

原位址:http://www.cnblogs.com/88999660/archive/2013/03/22/2976105.html <?xml version="1.0" ...

WLAN曆史概述-01

無線網絡介紹 無線網絡的初步應用,可以追朔到第二次世界大戰期間,當時美國陸軍采用無線電信号做資料的傳輸.他們研發出了一套無線電傳輸科技,并且采用相當高強度的加密技術,得到美軍和盟軍的廣泛使用.他們也許 ...

&lbrack;Angular 2&rsqb; Create Angular 2 Porject with Angular CLI

Install: npm i -g angular-cli Create a project: ng new hello-angular2 Run the project: cd hello-angu ...

HDOJ&lpar;HDU&rpar; 2091 空心三角形

Problem Description 把一個字元三角形掏空,就能節省材料成本,減輕重量,但關鍵是為了追求另一種視覺效果.在設計的過程中,需要給出各種花紋的材料和大小尺寸的三角形樣闆,通過電腦臨時做出 ...

如何一步一步用DDD設計一個電商網站(十二)—— 送出并生成訂單

閱讀目錄 前言 解決資料一緻性的方案 回到DDD 設計 實作 結語 一.前言 之前的十一篇把使用者購買商品并送出訂單整個流程上的中間環節都過了一遍.現在來到了這最後一個環節,送出訂單.單從業務上看,這個 ...

Mac OS 的指令行 總結

du 指令 檢視目錄下所有檔案的大小: du -sh * ls 指令 直接顯示目前目錄下的所有的非隐藏檔案: ls // 怎麼在文章中顯示不出來?? 顯示目前目錄下的所有的檔案(包括隐藏的): ls ...

ARMV8 datasheet學習筆記3:AArch64應用級體系結構

1.前言 本文主要從應用的角度介紹ARMV8的程式設計模型和存儲模型 2. AArch64應用級程式設計模型 從應用的角度看到的ARM處理器元素: 可見的元素(寄存器/指令) 說明 可見的寄存器 R0-R30 ...

活字格Web應用平台學習筆記1 - 下載下傳安裝,ready go

今年有一個很重要的職業目标,就是好好學習活字格這個神器,争取在這兩個月拿到活字格初級工程師的認證證書.給自己加個油,今天開始好好學習,好好做筆記. 第一步,下載下傳安裝 先去活字格官網:http://ww ...