連接池 與用戶請求建立連接
核心功能層 查詢解析,分析,優化,內置函數,跨存儲引擎的功能
存儲引擎層 數據的存入和提取
mysql的發送默認爲明文,可以使用ssl加密數據
parser 詞法,語法,語意分析,優化
explain 分析工具
query cache 緩存,只保存select查詢
併發訪問控制:基於鎖來實現
MySQL鎖:
執行操作時施加的鎖的模式
讀鎖:用戶在讀的時候施加的鎖,爲防止別人修改,但是用戶可以讀,還被稱爲共享鎖
寫鎖:獨佔鎖,排它鎖。其他用戶不能讀,不能寫
鎖粒度:
表鎖:table lock
鎖定了整張表
行鎖:row lock
鎖定了需要的行
粒度越小,開銷越大,但併發性越好:
粒度越大,開銷越小,但並非性越差;
鎖的實現位置:
MySQL鎖 可以手動使用,可以使用顯示鎖
存儲引擎鎖 自動進行的(隱式鎖)
顯示鎖:
LOCK TABLES t1 READ; 施加讀鎖
LOCK TABLES t1 WRITE; 施加寫鎖
UNLOCK TABLES; 解鎖
SHOW OPEN TABLES WHERE In_use > 0; 查看那些表被鎖定
InnoDB存儲引擎也支持另外一種顯示鎖(鎖定挑選出的部分行,行級鎖)
select .... lock in share mode
select .... for update
SHOW TABLE STATUS LIKE 't1'\G
SELECT * FROM t1 WHERE ID <=3 LOCK IN SHARE MODE;
做備份時要手動施加讀鎖
事務:Transaction
事務就是一組原子性的查詢語句,也即將多個查詢當作一個獨立的工作單元
ACID測試:能夠滿足ACID測試就表示其支持事務,或兼容事務
A:Atomicity 原子性,都執行或者都不執行
C:Consistency 一致性,從一個一致性狀態轉到另外一個一致性狀態
I:Isolaction 隔離性。一個事務的所有修改操作在提交前對其他事務時不可見的
D: Durability 持久性,一旦事務得到提交,其所做的修改會永久有效
安全性越高,併發性越低
隔離級別:
READ UNCOMMITTEND (讀未提交),髒讀,不可重複讀,幻讀
READ COMMITTEND (讀提交)
REPEATABLE READ (可重讀)
SERIALIZABLE (可串行化)強制事務的串行執行避免了幻讀;性能極低
START TRANSACTION; 啓動事務( MyISAM不支持事務)
COMMIT; 事務提交
ROLLBACK 事務回滾(全部回滾)
SAVEPOINT identifier 創建回滾點
ROLLBACK TO identifier 事務回滾(回滾到某個點)
mysql事務默認自動提交,對手動顯示啓動事務不會影響。
如何沒有顯式啓動事務,每個語句都會當作一個默認的事務,其執行完成會被自動提交
可通過如下方式關閉自動提交。
SHOW GLOBAL VARIABLES LIKE '%commit%';
select @@global.autocommit
set global autocommit = 0
注意 關閉自動提交,請記得手動啓動事務,應記得手動提交
查看mysql的事務隔離級別
show global variables like '%iso%'
select @@global.tx_isolation
建議:對事物要求不特別嚴格的場景下,可以使用讀提交
MVCC:多版本併發控制
每個事務啓動時,InnoDB會爲每個啓動的事務提供一個當下時刻的快照
爲實現此功能,InnoDB會爲每個表提供兩隱藏的字段,一個用於保存行的創建時間,一個用於保存行的失效時間
裏面存儲的系統版本號
MVCC只在兩個隔離級別下有效:read committed和repeatable read