myisam和innodb是mysql資料庫前後的兩種預設資料儲存引擎,那麼兩者究竟有什麼區別呢?
一,首先是在鎖的方面
myisam之可以使用表級鎖,不支援使用行級鎖。這是什麼意思呢?
在myisam資料庫執行讀請求期間,會預設對該請求加上共享鎖(讀鎖),在這乙個鎖級別下,使用者可以進行讀共享不可以進行寫請求。當然我們也可以使用local tables read|write來將表的鎖住,阻塞其他的讀或者寫請求解鎖是。
同樣如果myisam還自帶排他鎖,也就是寫鎖。意思就是當資料庫在執行寫請求時不允許使用者其他請求的干擾。也就是上了共享鎖之後可以繼續上共享鎖,但是上了寫鎖之後不能施加任何鎖。
innodb預設使用行級鎖,但是也支援表級鎖。實際上這也是innodb能夠保證事務不出問題的真正原因。
innodb是支援事務的,所以我們可以通過session取鎖暫時不自動提交的方式模擬併發訪問的過程。
innodb加鎖預設的是加二級鎖,我們可以在使用set autocommi=0關閉當前事務的自動提交,這樣就需要在執行事務之前加鎖(lock in share mode為手動加共享鎖,for update 為手動加排他鎖,commit之後進行統一解鎖。)比如 我們可以select * from where id =3 lock in share mode。只要不執行commit,這行就會永遠的鎖下去,同理,我們也可以使用for update為他手動新增排他鎖。commit時,鎖才會被釋放。
二,count運算上的區別:
因為myisam有meta-data,所以全量查詢很快,但是innodb沒有
三,事務與安全:
myisam效能會更快,但是不支援事務,innodb支援事務,所以也支援事務相關的,隔離,回滾,等等的acid操作
四,myisam不支援外來鍵,innodb支援
五,在索引方面。
說到這一點就不得不說一樣密集索引和稀疏索引的區別,密集索引是指每乙個搜尋碼的值都對應乙個索引值。
稀疏索引檔案只為索引碼的某些值建立索引項。
在myisam中,
不管是主鍵索引,唯一鍵索引還是普通索引,其索引都屬於稀疏索引。
在innodb中,
若乙個主鍵被定義,則主鍵則作為密集索引。
若沒有主鍵被定義,該錶的第乙個唯一非空索引則作為密集索引。
若不滿足以上條件,innodb內部會生成乙個隱藏主鍵(密集索引)。
非主鍵索引儲存相關鍵位和其對應的主鍵值,包含兩次查詢。
MySQL中MyISAM與InnoDB區別
mysql中myisam與innodb區別 myisam innodb 事物處理 不支援支援 外來鍵不支援 支援行鎖 不支援支援 全文索引 支援不支援 表的具體行數 儲存表的具體行數 掃瞄表來計算行數 delete表時 先drop表,然後重建表 一行一行的刪除 索引和資料 分開的,並且索引是有壓縮的...
MySQL中MyISAM與InnoDB區別及選擇
innodb 支援事務處理等 不加鎖讀取 支援外來鍵 支援行鎖 不支援fulltext型別的索引 不儲存表的具體行數,掃瞄表來計算有多少行 delete 表時,是一行一行的刪除 innodb 把資料和索引存放在表空間裡面 跨平台可直接拷貝使用 innodb中必須包含auto increment型別欄...
MySQL中MyISAM與InnoDB區別及選擇
支援事務處理等 不加鎖讀取 支援外來鍵 支援行鎖 不支援fulltext型別的索引 不儲存表的具體行數,掃瞄表來計算有多少行 delete 表時,是一行一行的刪除 innodb 把資料和索引存放在表空間裡面 跨平台可直接拷貝使用 innodb中必須包含auto increment型別欄位的索引 很難...