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是乙個系統管理守護程序 工具和庫的集...