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千萬。為什麼是這麼多呢?因為這是可以算出來的,要搞清楚這個問題,我們先...