mysql suoyin 和鎖 Mysql索引與鎖

2021-10-22 02:07:30 字數 2196 閱讀 2133

mysql索引與鎖

mysql索引與鎖

本文以mysql5.7為例測試。

1:mysql索引方法

mysql的索引方法分為btree索引和hash索引。

hash索引:是通過hash計算後比較,所以只能用於等值過濾,不能用於範圍過濾。hash索引會根據列資料維護一張hash表,所以任何時候都要進行hash表掃瞄,當hash表資料量龐大時,效能急劇下降。

是否使用索引

select * from t1 where c1=1 and c2=2

select * from testindex where c2>'1' and c1

select * from t1 where c1=1

select * from t1 where c2=2

結論:如果需要使用c2過濾時使用索引,必須同時用c1過濾

create table `testnoindex` (

`id` int(11) not null auto_increment,

`c1` varchar(255) default null,

primary key (`id`)

) engine=innodb auto_increment=11 default charset=utf8;

id為主鍵索引,c1為普通字段,初始化一些資料方便檢視

注意:c1一定是無索引情況,如果有索引(非唯一索引),都不會鎖整張表。

session2:更新id為1的記錄,獲取鎖超時。

以上例項可以證明mysql innodb儲存引擎預設是表級鎖,當然innodb是支援行級鎖的,比如通過唯一主鍵就可實現行級鎖。

如果where條件的索引資料是多行的話,多行資料會同時被鎖定,可理解為範圍鎖。

mysql有三種鎖record,gap, and next-keylocks。recode為行鎖,gap為間隙鎖,next-keylocks為前兩種的結合。我們先看乙個例項,加入mysql中記錄為如下所示:

session1:執行下面語句,因為沒有7的記錄,會向左掃瞄至id=2的記錄,向右掃瞄至id=8的記錄,鎖定區間為(2,8)。

set autocommit=0;

update testnoindex set c1='2017-08-0210:47:09' where id=7;

session2:執行如下語句,可以看出id=4的記錄被鎖定。

insert into testnoindex (id,c1)values(16,now());

insert into testnoindex (id,c1)values(4,now());

[sql]insert into testnoindex (id,c1)values(16,now());

受影響的行: 1

[sql]

insert into testnoindex (id,c1)values(4,now());

[err] 1205 - lock wait timeout exceeded;try restarting transaction

4:共享鎖與排他鎖

mysql行級鎖又分為共享鎖(讀鎖或s鎖)和排他鎖(寫鎖或x鎖),比如forupdate就是排它鎖。mysql預設delete,insert,update都是排它鎖,select預設無鎖。

²  如果行記錄被加了排它鎖,則其他事務無法再在其上加鎖,也就是加鎖狀態無法讀取/修改。換句話說就是如果被加了排他鎖的行,不能再加排他或共享鎖,但是可以無鎖讀取(普通select,)。

²  如果行記錄被加了共享鎖,則其他事務只能在共享鎖或無鎖狀態下讀取。

mysql索引與鎖相關教程

mysql suoyin 和鎖 MySQL索引與鎖

每個資料頁裡面的記錄可以組成乙個單向鍊錶。在沒有任何索引的的表中,select語句的執行會進行如下兩次遍歷遍歷雙向鍊錶,找到所在頁 遍歷頁內的單鏈表,找到所在的記錄 索引提高檢索速度 索引的主要作用就是將無序變成有序。record type 1 代表存放的是普通目錄項的記錄 record type ...

使用systemctl命令啟動和關閉mysql

以前都用service命令管理mysql,現在liunx系統公升級了,又有了新的更好的方法管理系統程序,現在我們來學習如何用systemctl命令管理mysql。systemctl是乙個systemd工具,主要負責控制systemd系統和服務管理器。systemd是乙個系統管理守護程序 工具和庫的集...

使用systemctl命令啟動和關閉mysql

以前都用service命令管理mysql,現在liunx系統公升級了,又有了新的更好的方法管理系統程序,現在我們來學習如何用systemctl命令管理mysql。systemctl是乙個systemd工具,主要負責控制systemd系統和服務管理器。systemd是乙個系統管理守護程序 工具和庫的集...