讀薄《高效能MySql》(一)MySql基本知識
高效能 Mysql 的讀書筆記。因為這本書寫的實在是太好了,即使只是隨便翻一下都讓人受用無窮。於是寫下讀書筆記加深印象,也方便沒空讀這本書的人粗略讀一下這本書。
Mysql 的併發控制
讀寫鎖
因為併發的讀取資料並不會出現問題,但是併發的讀寫或者併發寫寫操作就會出現問題了,所以在併發處理的時候如果將讀操作也加上鎖那麼就浪費了資源。
這時候就引入了共享鎖和排他鎖來解決這個問題。它們也叫做讀鎖和寫鎖。相當於 Java 併發包中的 ReadWriteLock。
鎖粒度
儘量減小鎖的粒度鎖定有利於增加併發量,但是加鎖的粒度越小,加鎖開銷越大。
行鎖:併發粒度小,加鎖開銷大,最大程度增加了併發處理
表鎖:鎖定整張表,加鎖開銷小
事務
事務的特性
事務有 ACID 幾個特性
Atomicity 原子性:
原子性任務是一個獨立的操作單元,一個事務要麼全部提交成功,要麼全部失敗回滾。
Consistency 一致性:
資料庫總是從一個一致性的狀態轉移到另外一個一致性的狀態。當事務失敗的時候它所作出的修改也不會儲存到資料庫中。
Isolation 隔離性:
一個事務所做的修改在提交前對其他的事務是不可見的。
Durability 耐久性:
一旦一個事務提交,所做的修改就會永久儲存到資料庫中。
隔離級別
SQL 定義了四種隔離級別,每一種級別規定了一個事務中所做的修改,哪些修改在事務內和事務間是可見的。
級別低的可以執行更高的併發,系統開銷也低。
髒讀:一個事務讀到了其他事務未提交的資料
不可重複讀:事務 A 第一次讀取到 row1,然後有事務 B 提交修改後,事務 A 再次查詢到這一行,但是內容不一樣
幻讀:事務A第一次查詢得到一行記錄row1,事務B提交修改後,事務A第二次查詢得到兩行記錄row1和row2。
READ UNCOMITED(未提交讀)
在這個級別中,事務的修改即使沒有提交對其他的事務也是可見的。這樣會導致髒讀問題,從效能上來說,它也不會比其他的好很多,所以一般不用
READ COMMITED(提交讀)
大多數資料庫預設隔離級別都是這個(Mysql 不是),一個事務開始的時候只能看見已經提交過的事務。這個級別也叫做不可重複讀。
REPEATABLE READ(可重複讀)
它是 Mysql 的預設事務隔離級別。這個級別保證了同一個事務中多次讀取同樣的記錄結果是一致的,但是解決不了幻讀問題。
SERIALIZABLE(可序列化)
這個事務執行級別最高,避免了幻讀的問題,在每一個數據上都加上鎖,可能會導致大量的鎖爭用的問題。這個級別也很少用。
MYSQL 相關特性
Mysql 預設使用的是自動提交,如果不顯式地開始一個事務,所有的查詢都會被當做一個事務提交。
可以通過設定 AUTOCOMMIT 變數來啟動或者禁用自動提交。
當然對於 MyISAM 這類沒有事務概念的引擎,這個是一直啟用的。
Mysql 中的事務型儲存引擎都不是簡單的行鎖,它們一般都實現了多版本的併發控制 MVCC ,可以簡單的認為 MVCC 是行鎖的一個變種。
如何選擇合適的儲存引擎
其實如果根據書上的話來總結,就是這一幅圖