mysql資料庫引擎InnoDB和MyISAM
一.Mysql鎖分類
- 表級鎖:開銷小,加鎖塊;不會出現死鎖,鎖定粒度大,發生鎖衝突的概率最高,併發度最低。
- 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發性也最高。
- 頁面鎖:開銷和加鎖界於表鎖和行鎖之間,會出現死鎖;鎖定粒度界與表鎖和行鎖之間,併發一般。
二.MyISAM
1.開門見山
- 1.MyISAM不支援事物;
- 2.MyISAM只支援表鎖 ;
- 不能在表損壞後恢復資料;
MyISAM表鎖有兩種模式:表共享讀鎖(table read lock)和表獨佔寫鎖(table write lock),鎖的解釋如下:
- myISAM表的讀操作,不會阻塞其他使用者對同一個表的讀請求,但會阻塞對同一個表的寫請求。
- myISAM表的寫操作,會阻塞其他使用者對同一個表的讀和寫操作。
- myISAM表的讀、寫操作之間、以及寫操作之間是序列的。
適合在以下幾種情況下使用:
- 做很多count的計算
- 查詢非常頻繁
MyISAM在執行查詢前,會自動執行表的加鎖、解鎖操作,一般情況下不需要使用者手動加、解鎖,但是有的時候也需要顯示加鎖。當然也可以用union做關聯查詢代替
1 lock table t1 read, t2 read; 2 select count(t1.id) as 'total' from t1; 3 select count(t2.id) as 'total' from t2; 4 unlock tables;
注意事項
1.在鎖定表時候,如果加上關鍵字local ,滿足myISAM表的併發插入問題 。 eg: lock table t3 read local;
2.使用locak tables 給表加鎖時候,必須同時給所有涉及到的表加鎖,因為加鎖之後,當前會話,就不能操作沒有加鎖的表。
2.併發插入問題
MyIAM表的讀和寫是序列的,但是這是就總體而言,在一定條件下MyISAM表也支援查詢和插入操作的併發進行.
MyISAM儲存引擎有一個系統變數concurrent_insert ,專門用於充值其併發插入的行為,其值分別可以為0,1和2
當concurrent_insert = 0 時,不允許併發插入
當concurrent_insert = 1時,如果myisam表中沒有空洞(即表的中間沒有被刪除的行),myisam允許在一個程序讀表的同時,另一個程序從表尾插入記錄
當concurrent_insert = 2時,無論myisam表中有沒有空洞,都允許在表尾併發插入記錄
3.MyISAM鎖排程問題
MyISAM儲存引擎的讀鎖和寫鎖是互斥的,讀寫操作室序列的,那麼如果讀寫兩個程序同時請求同一張表,Mysql將會使寫程序先獲得鎖。不僅僅如此,即使讀請求先到達鎖等待佇列,寫鎖後到達,寫鎖也會先執行。因為mysql因為寫請求比讀請求更加重要。這也正是MyISAM不適合含有大量更新操作和查詢操作應用的原因。
調節辦法:
- 通過指定啟動引數low-priority-updates,使MyISAM引擎預設給與讀請求優先的許可權
- 通過執行set low_PRIORITY_UPDATES=1,降低更新請求的優先順序。
- 指定INSERT、UPDATE、DELETE語句的LOW_PRIORITY屬性。
三.InnoDB儲存引擎
1.開門見山
具有提交、回滾和崩潰恢復能力的事務安全(ACID相容)儲存引擎。
- 支援事物和外來鍵
- 預設是行鎖
- 支援資料恢復
注意:行鎖在某些情況下會變成表鎖,比如SQL的更新(update)或者刪除(delete)語句中未使用到索引,導致在InnoDB在對資料進行相應操作的時候必須把整個表鎖起來進行檢索(表鎖)。而如果使用了索引的話,InnoDB只會通過索引條件檢索資料,而只鎖住索引對應的行(行鎖)。
2.例項分析
問題描述:
- 系統中有一個實時的定時任務,當有條件觸發的時候,會更新對應的A表;
- 但是同時有另外一個對A表的寫操作,因此當進行測試的時候,有時候會不固定的出“Lock wait timeout exceeded ”的錯誤。
當出現這個問題的時候,從很多的地方進行了分析,然後都無法得到正確的解決方案(因為描述1模組不是我寫的,所以沒有去檢視更新表的程式碼操作)
可能的原因:
在描述1中定時任務更新表A的時候,更新條件中沒有使用索引,導致當進行定時任務更新表的時候形成了表鎖。然後因為表A資料量比較大,檢索較慢,然後導致了描述2中對錶A的寫操作的等鎖超時。
3.適用的場景
- 更新和查詢都相當的頻繁,多重併發
- 要求事務,或者可靠性要求比較高
- 外來鍵約束,MySQL支援外來鍵的儲存引擎只有InnoDB
一般來說,如果需要事務支援,並且有較高的併發讀取頻率,InnoDB是不錯的選擇。