1. 程式人生 > >mysql數據庫引擎InnoDB和MyISAM

mysql數據庫引擎InnoDB和MyISAM

delet spa 發生 lock 查看 加鎖 地方 也會 啟動參數

一.Mysql鎖分類  

  1. 表級鎖:開銷小,加鎖塊;不會出現死鎖,鎖定粒度大,發生鎖沖突的概率最高,並發度最低。
  2. 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,並發性也最高。
  3. 頁面鎖:開銷和加鎖界於表鎖和行鎖之間,會出現死鎖;鎖定粒度界與表鎖和行鎖之間,並發一般。

二.MyISAM

1.開門見山

  1. 1.MyISAM不支持事物;
  2. 2.MyISAM只支持表鎖
  3. 不能在表損壞後恢復數據;

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不適合含有大量更新操作和查詢操作應用的原因。 調節辦法:
  1. 通過指定啟動參數low-priority-updates,使MyISAM引擎默認給與讀請求優先的權限
  2. 通過執行set low_PRIORITY_UPDATES=1,降低更新請求的優先級。
  3. 指定INSERT、UPDATE、DELETE語句的LOW_PRIORITY屬性。

三.InnoDB存儲引擎

1.開門見山

  具有提交、回滾和崩潰恢復能力的事務安全(ACID兼容)存儲引擎。

  1. 支持事物和外鍵
  2. 默認是行鎖
  3. 支持數據恢復

  註意:行鎖在某些情況下會變成表鎖,比如SQL的更新(update)或者刪除(delete)語句中未使用到索引,導致在InnoDB在對數據進行相應操作的時候必須把整個表鎖起來進行檢索(表鎖)。而如果使用了索引的話,InnoDB只會通過索引條件檢索數據,而只鎖住索引對應的行(行鎖)。

2.實例分析

  問題描述:

  1. 系統中有一個實時的定時任務,當有條件觸發的時候,會更新對應的A表;
  2. 但是同時有另外一個對A表的寫操作,因此當進行測試的時候,有時候會不固定的出“Lock wait timeout exceeded”的錯誤。

  當出現這個問題的時候,從很多的地方進行了分析,然後都無法得到正確的解決方案(因為描述1模塊不是我寫的,所以沒有去查看更新表的代碼操作)

  可能的原因:

    在描述1中定時任務更新表A的時候,更新條件中沒有使用索引,導致當進行定時任務更新表的時候形成了表鎖。然後因為表A數據量比較大,檢索較慢,然後導致了描述2中對表A的寫操作的等鎖超時。

3.適用的場景

  1. 更新和查詢都相當的頻繁,多重並發
  2. 要求事務,或者可靠性要求比較高
  3. 外鍵約束,MySQL支持外鍵的存儲引擎只有InnoDB

  一般來說,如果需要事務支持,並且有較高的並發讀取頻率,InnoDB是不錯的選擇。

  

mysql數據庫引擎InnoDB和MyISAM