mysql 實驗論證 innodb表級鎖與行級鎖

2021-07-31 08:51:00 字數 1888 閱讀 8593

innodb 的行鎖是在有索引的情況下,沒有索引的表是鎖定全表的.

表鎖演示(無索引)

session1:

mysql> set autocommit=0;

mysql> select * from innodb_test;

+------+-------------+

| id   | name        |

+------+-------------+

|    1 | woshiceshi  | 

|    2 | woshiceshi2 | 

|    3 | woshiceshi3 | 

+------+-------------+

mysql> select * from innodb_test where id = 2 for update;

+------+------------+

| id   | name       |

+------+------------+

|    2 | woshiceshi2 | 

+------+------------+

session2:

mysql> update innodb_test set name='sjis' where id = 1 ;

處於等待狀態....

再回到session1 commit以後,session2就出來結果了(鎖定了8秒,過了8秒左右才去session1提交)。

mysql> update innodb_test set name='sjis' where id = 1 ;

query ok, 1 row affected (8.11 sec)

rows matched: 1  changed: 1  warnings: 0

實驗結果是:我在session1的for update 操作看似只鎖定id為2的行其實鎖定了全表,以至於後面session2的對id為1的行update 需要等待session1鎖的釋放。

行鎖演示(索引為id)

session1:

mysql> alter table innodb_test add index idx_id(id);

query ok, 4 rows affected (0.01 sec)

records: 4  duplicates: 0  warnings: 0

mysql> select * from innodb_test where id = 2 for update;

+------+------------+

| id   | name       |

+------+------------+

|    2 | woshiceshi2 | 

+------+------------+

session2:

mysql> update innodb_test set name='wohaishiceshi' where id = 1 ;

query ok, 1 row affected (0.02 sec)

rows matched: 1  changed: 1  warnings: 0

mysql> select * from innodb_test where id = 1;           

+------+---------------+

| id   | name          |

+------+---------------+

|    1 | wohaishiceshi | 

+------+---------------+

1 row in set (0.00 sec)

實驗結果:這次的鎖定是鎖定的行,所以沒有被鎖定的行(id不為2的行)可以進行update..

mysql日誌 InnoDB 監控

參考官方文件 innodb監視器提供有關innodb內部狀態的資訊。此資訊對效能調整很有用。14.17.1 innodb 監控型別 innodb監視器有兩種型別 innodb鎖定監視器列印額外的鎖定資訊作為標準innodb監視器輸出的一部分。14.17.2 啟用 innodb 監控 當innodb監...

Mysql學習 InnoDB快取

innodb是基於磁碟儲存的,其中的儲存記錄按照頁的方式進行管理,可將其視為基於磁碟的資料系統。由於磁碟讀寫速度與cpu計算速度之間的鴻溝,innodb對資料庫的讀寫操作都要通過快取來實現。在資料庫進行讀取操作時,先將從磁碟讀取到的資料放到快取池中,這個過程稱為將頁 fix 到快取池,下一次再讀取相...

MySQL儲存引擎 InnoDB

為什麼innodb不將總數存起來?innodb直接count 會遍歷全表 沒有where條件 雖然結果準確,但會導致效能問題。按照效率排序的話,count 字段 innodb一棵b 樹可以存放多少行資料?這個問題的簡單回答是 約2千萬。為什麼是這麼多呢?因為這是可以算出來的,要搞清楚這個問題,我們先...