
MySQL5.5后,默認存盤引擎是InnoDB,5.5之前默認是MyISAM,
InnoDB(事務性資料庫引擎)和MyISAM的區別補充:
- InnoDB是聚集索引,資料結構是B+樹,葉子節點存K-V,V存的是資料頁,MyISAM是非聚集索引,V上存的是主鍵值,查到主鍵后還需要從聚集索引上再查一次,
- InnoDB是具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表,適合存在大量insert、update場景,
- MyISAM強調的是性能,不支持事務,最大缺陷就是崩潰后無法安全恢復,更適合讀密集的小型應用,
- InnoDB支持MVCC(多版本控制),應對高并發事務, MVCC比單純的加鎖更高效,所以InnoDB更適合高并發場景,
- InnoDB支持外鍵
- MyISAM支持資料壓縮
常用命令
//查所有引擎
mysql> show engines;
//查當前引擎
mysql> show variables like '%storage_engine%';
InnoDB的行級鎖
InnoDB支持的行級鎖,包括如下幾種:
-
Record Lock:對索引項加鎖,鎖定符合條件的行,其他事務不能修改和洗掉加鎖項,
-
Gap Lock:對索引項之間的“間隙”加鎖,鎖定記錄的范圍(對第一條記錄前的間隙或最后一條將記錄后的間隙加鎖),不包含索引項本身,其他事務不能在鎖范圍內插入資料,這樣就防止了別的事務新增幻影行,
-
Next-key Lock:鎖定索引項本身和索引范圍,即Record Lock和Gap Lock的結合,可解決幻讀問題,
-
innodb對于行的查詢使用next-key lock
-
Next-locking keying為了解決Phantom Problem幻讀問題
-
當查詢的索引含有唯一屬性時,將next-key lock降級為record key
-
Gap鎖設計的目的是為了阻止多個事務將記錄插入到同一范圍內,而這會導致幻讀問題的產生
-
有兩種方式顯式關閉gap鎖(除了外鍵約束和唯一性檢查外,其余情況僅使用record lock):
-- 將事務隔離級別設定為RC
-- 將引數innodb_locks_unsafe_for_binlog設定為1
InnoDB的行級鎖是基于索引實作的,如果查詢陳述句未命中任何索引,那么InnoDB會使用表級鎖,
不同于MyISAM總是一次性獲得所需的全部鎖,InnoDB的鎖是逐步獲得的,當兩個事務都需要獲得對方持有的鎖,導致雙方都在等待,這就產生了死鎖,發生死鎖后,InnoDB一般都可以檢測到,并使一個事務釋放鎖回退,
避免死鎖:
- 通過表級鎖來減少死鎖產生的概率;
- 多個程式盡量約定以相同的順序訪問表(哲學家就餐問題);
- 同一個事務盡可能做到一次鎖定所需要的所有資源,
表級鎖和行級鎖可以進一步劃分為共享鎖(s)和排他鎖(X),
參考
《MySQL應知應會》
《Java工程師修煉之道》
https://blog.csdn.net/qq_34337272/article/details/80611486
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/76883.html
標籤:MySQL
上一篇:mysql存盤程序
下一篇:mysqldump備份指定的資料
