InnoDB與MyISAM
Mysql 在5.5之前默認(rèn)使用 MyISAM 存儲引擎,之后使用 InnoDB 。查看當(dāng)前存儲引擎:
show variables like '%storage_engine%';
MyISAM 操作數(shù)據(jù)都是使用的表鎖,你更新一條記錄就要鎖整個表,導(dǎo)致性能較低,并發(fā)不高。當(dāng)然同時它也不會存在死鎖問題。
而 InnoDB 與 MyISAM 的最大不同有兩點(diǎn):一是 InnoDB 支持事務(wù);二是 InnoDB 采用了行級鎖。也就是你需要修改哪行,就可以只鎖定哪行。
在 Mysql 中,行級鎖并不是直接鎖記錄,而是鎖索引。索引分為主鍵索引和非主鍵索引兩種,如果一條sql 語句操作了主鍵索引,Mysql 就會鎖定這條主鍵索引;如果一條語句操作了非主鍵索引,MySQL會先鎖定該非主鍵索引,再鎖定相關(guān)的主鍵索引。
InnoDB 行鎖是通過給索引項加鎖實現(xiàn)的,如果沒有索引,InnoDB 會通過隱藏的聚簇索引來對記錄加鎖。也就是說:如果不通過索引條件檢索數(shù)據(jù),那么InnoDB將對表中所有數(shù)據(jù)加鎖,實際效果跟表鎖一樣。因為沒有了索引,找到某一條記錄就得掃描全表,要掃描全表,就得鎖定表。
如何查看鎖信息
select * from information_schema.innodb_locks; # 鎖的概況
show engine innodb status; # InnoDB整體狀態(tài),其中包括鎖的情況