因爲目前接觸到的客戶還在使用MyISAM存儲引擎,因此抽空看了一下MyISAM存儲引擎的一些知識。session
因爲在2010年MySQL默認的存儲引擎已是Innodb存儲引擎了,因此一直是深刻了解的是InnoDB相關的知識。併發
結論一:MyISAM存儲引擎默認SELECT語句會在表級別加一個共享讀鎖(table read lock)。spa
結論二:MyISAM存儲引擎表會優先執行DML語句,即便是先接受到SELECT語句。blog
如何驗證上述兩個結論?事務
驗證方案:由於MyISAM引擎表不支持事務,因此咱們不能像InnoDB表同樣開啓一個事務,來查看當前有哪些鎖。因此經過模擬併發的操做,第一個session作select操做,第二個session作更新操做,第三個session執行show full processlist;查看語句當前執行的狀態。ssl
驗證步驟:io
一、首先插入2千萬行的數據到myisam表中。table
二、而後打開三個MySQL鏈接窗口,並準備好下面的語句。第一個session查詢某一個值;第二個session執行更新操做,更新全部的行;第三個執行show full processlist;select
三、而後依次執行三個窗口的SQL語句。im
經過上述兩個結論咱們能夠得出如下幾條結論
結論三:MyISAM能夠用於非事務性數據系統,能夠接受宕機致使數據丟失、而且只有讀操做的場景,並不適用於讀多寫少的場景。由於咱們上面看到了讀寫是互斥的,這在InnoDB存儲引擎是不會發生的,InnoDB經過行多版本併發控制很好的解決了讀寫互斥的問題,而且保證在讀取時,讀取到的是已經提交了的數據。