1. 原理
- mysql是同由連接池、SQL接口、解析器、優化器、緩存、存儲引擎組成的。
- Mysql支持的存儲引擎有很多,它是mysql中具體與文件打交道的子系統,最常用的用MyISAM,InnoDB.
- MyISAM查詢快,但不支持事務,不支持外鍵。InnoDB支持事務,並提供行級鎖定,是其默認的存儲引擎。
## 2.日誌
- MySQL中有三種日誌文件,redo log、bin log、undo log。
- redo log 是 存儲引擎層(innodb)生成的日誌,主要爲了保證數據的可靠性;
- bin log 是 MySQL 數據庫層面上生成的日誌,主要用於 point in time 恢復和主從複製。
- undo log 主要用於事務的回滾(undo log 記錄的是每個修改操作的逆操作) 和 一致性非鎖定讀(undo log 回滾行記錄到某種特定的版本---MVCC 多版本併發控制)。
3.數據結構
MySQL索引的數據結構是採用B+樹。https://www.cnblogs.com/lianzhilei/p/11250589.html
4.死鎖
非主鍵更新時引起死鎖
- 主鍵更新時會鎖住主鍵索引,非主鍵索引更新時,會先鎖住非主鍵索引,再鎖定主鍵索引。 如:update good set status= '1' where title= '商品'
- 建議:默認更新時,先獲取需要更新的記錄的主鍵,再通過主鍵更新記錄避免死鎖。
無索引更新時引起死鎖
- InnoDB 的行鎖是通過給索引上的索引項加鎖來實現的,意味着只有通過索引條件檢索數據,才能使用行級鎖,否則將使用表鎖。
- 建議:相關條件字段加索引;
多線程更新時引發死鎖
- 當where 語句中包括多個條件 時,要建立複合索引,減小死鎖的可能性.