MySQL邏輯架構:
並發控制:由鎖實現
讀鎖:也叫共享鎖,讀鎖互相不阻塞。A加鎖表後A,b,c,d都能讀該表但不能寫該表。
寫鎖:也叫排他鎖,寫鎖相互阻塞。A加排他鎖後,其他線程不能讀寫該表。
鎖粒度:
表鎖:鎖一個表,並發粒度小。代表存儲引擎MyISAM
行鎖:鎖一行數據,並發粒度大,並發操作表性能好。代表存儲引擎InnoDB。鎖粒度小系統對鎖的開銷也大。
假如給一個表加讀鎖,那麼其他線程也無法對該表進行寫操作了,如果是加行鎖那麼該線程只阻塞只對這一行數據的讀寫,表中其他行的數據其他線程可以讀寫,提高並發性能。
事務:相當於把N條語句打包成一條語句,這個包中的N條語句全部執行成功則成功,如果有其中一條語句沒有執行成功則事務回滾到原先狀態事務執行失敗不寫入硬盤。
ACID(atomicityconsistency isolation durability)原子性,一致性,隔離性,持久性。是事務存儲引擎的特性。
原子性:事務相當於一個N條語句的包,要麼全部執行成功,要麼則失敗,對於事務來說不能成功執行一個事務的一部分,這就是原子性。
一致性:從一個一致的狀態轉換到另一個一致的狀態。要麼成功轉換為成功的狀態,要麼失敗回滾為原來的狀態。
隔離性:A事務看不到B事務。
持久性:事務執行成功則寫入硬盤,這就是叫持久性。
存儲引擎:
·數據庫存在目錄中,庫中的表存在該目錄下。
·查看存儲引擎:show table status like ‘table_name’ \G;
MyISAM存儲引擎
·將表存在3個文件中.MYD存數據.MYI存索引.frm存表定義。
·支持表鎖
·myisam表很大時更容易出現故障,需要手工進行修復表,並且修復時間會非常漫長。修復表步驟:檢查表,然後修復表。
·壓縮表
InnoDB
·將表存在2個文件中ibdata1數據文件和數據庫目錄下的.frm表定義文件。
·支持事務
·支持行鎖
·外鍵約束
·基於聚簇索引建立的,聚簇索引對主鍵查詢性能非常高。
·InnoDB支持熱備份,而其他所有存儲引擎都不支持熱備份。
選擇合適的存儲引擎:
·MySQL5.5默認存儲引引擎為InnoDB,最簡單的答案是如果你不知道該選用何種存儲引擎那麼你就用InnoDB,因為它支持事務並且性能好。有些人說MyISAM性能比InnoDB快,這可不一定,書中說很多時候InnoDB讓MyISAM望塵莫及。
選擇依據:
1、事務:InnoDB支持事務,MyISAM不是事務型存儲引擎。
2、InnoDB支持在線熱備份。
3、崩潰恢復,InnoDB是事務型存儲引擎支持,MyISAM崩潰後修復一個大的表是非常慢的。
4、特有特性,比如聚簇索引,外鍵約束,行鎖等等。
如果對數據安全性要求不高,並且主要讀取的並且數據庫表不是很大的場景下應用MyISAM。
數據量非常大那麼還是用InnoDB吧,當讀寫非常頻繁時候行級鎖性能更好。