mysql的表索和行索 mysql行鎖和表鎖

2021-10-17 22:32:54 字數 1644 閱讀 4219

在呼叫儲存過程中,就會涉及到表鎖,行鎖這一概念:所謂區別:有索引的時候就是行鎖,沒有索引的時候就是表索。

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引索某一行 mysql索引

mysql的索引 索引用於快速找出在某個列中有一特定值的行,不使用索引,mysql必須從第一條記錄開始讀完整個表,直到找出相關的行,表越大,查詢資料所花費的時間就越多,如果表中查詢的列有乙個索引,mysql能夠快速到達乙個位置去搜尋資料檔案,而不必檢視所有資料,那麼將會節省很大一部分時間。myisa...

mysql引索某一行 MySQL之索引

索引 什麼是索引 可以理解為 搜尋引導,索引是乙個特殊的資料結構,其儲存的是資料的關鍵資訊與詳細資訊的位置對應關係 例如 書本的目錄 為什麼需要索引 加速查詢,當資料量非常大的時候,查詢某乙個資料是非常慢 索引的影響 1.不是說有了索引就能加速,得看你的查詢語句有沒有正確使用索引 2.索引也需要占用...

mysql三表關聯加索引 mysql 三表索引優化

建表語句 create table if not exists phone phoneid int 10 unsigned not null auto increment,card int 10 unsigned not null,primary key phoneid engine innodb ...