您好,登錄后才能下訂單哦!
這期內容當中的小編將會給大家帶來有關MySQL中InnoDB與MyISAM的區別,以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
InnoDB存儲引擎
InnoDB,是MySQL的數據庫引擎之一,現為MySQL的默認存儲引擎,為MySQL AB發布binary的標準之一。InnoDB由Innobase Oy公司所開發,2006年五月時由甲骨文公司并購。與傳統的ISAM與MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事務(Transaction)功能,類似于PostgreSQL。
InnoDB 給 MySQL 提供了具有事務(transaction)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)、多版本并發控制(multi-versioned concurrency control)的事務安全(transaction-safe (ACID compliant))型表。
MyISAM存儲引擎
MyISAM是默認存儲引擎(Mysql5.1前)。它基于更老的ISAM代碼,但有很多有用的擴展。(注意MySQL 5.1不支持ISAM)。 每個MyISAM在磁盤上存儲成三個文件,每一個文件的名字均以表的名字開始,擴展名指出文件類型。
InnoDB和MyISAM的區別
事務
為了數據庫操作的原子性,我們需要事務。保證一組操作要么都成功,要么都失敗,比如轉賬的功能。我們通常將多條SQL
語句放在begin
和commit
之間,組成一個事務。
InnoDB
支持,MyISAM
不支持。
索引
為了優化查詢的速度,進行排序和匹配查找,我們需要索引。比如所有人的姓名從a-z
首字母進行順序存儲,當我們查找zhangsan
或者第44
位的時候就可以很快的定位到我們想要的位置進行查找。
InnoDB
是聚集索引,數據和主鍵的聚集索引綁定在一起,通過主鍵索引效率很高。如果通過其他列的輔助索引來進行查找,需要先查找到聚集索引,再查詢到所有數據,需要兩次查詢。
MyISAM
是非聚集索引,數據文件是分離的,索引保存的是數據的指針。
從InnoDB 1.2.x
版本,MySQL5.6
版本后,兩者都支持全文索引。
auto_increment
自增
對于自增數的字段,InnoDB
要求該列必須是索引,同時必須是索引的第一個列,否則會報錯:
mysql> create table test( -> a int auto_increment, -> b int, -> key(b,a) -> ) engine=InnoDB; ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
把(b,a)
順序替換為(a,b)
即可。
而MyISAM
可以將該字段與其他字段隨意順序組成成聯合索引。
表行數
很常見的需求是看表中有多少條數據,此時我們需要select count(*) from table_name
。
InnoDB
不保存表行數,需要進行全表掃描。MyISAM
用一個變量保存,直接讀取該值,更快。當時當帶有where
查詢的時候,兩者一樣。
存儲
數據庫的文件都是需要在磁盤中進行存儲,當應用需要時再讀取到內存中。一般包含數據文件、索引文件。
InnoDB
分為:
.frm
表結構文件.ibdata1
共享表空間.ibd
表獨占空間.redo
日志文件MyISAM
分為三個文件:
.frm
存儲表定義.MYD
存儲表數據.MYI
存儲表索引主鍵
由于InnoDB
的聚集索引,其如果沒有指定主鍵,就會自動生成主鍵。MyISAM
支持沒有主鍵的表存在。
外鍵
為了解決復雜邏輯的依賴,我們需要外鍵。比如高考成績的錄入,必須歸屬于某位同學,我們就需要高考成績數據庫里有準考證號的外鍵。
InnoDB
支持,MyISAM
不支持。
執行速度
如果你的操作是大量的查詢操作,如SELECT
,使用MyISAM
性能會更好。
如果大部分是刪除和更改的操作,使用InnoDB
。
InnoDB
和MyISAM
的索引都是B+
樹索引,通過索引可以查詢到數據的主鍵,不熟悉B+
樹的可以查看MySQL InnoDB索引原理和算法。兩者的性能區別主要在于查詢到數據主鍵后兩者的處理方式卻不同。
InnoDB
會緩存索引和數據文件,一般以16KB
為一個最小單元(數據頁大小)和磁盤進行交互,InnoDB
在查詢到索引數據后實際得到的是主鍵的ID
,它需要在內存中的數據頁中查找該行的全部數據,但如果該數據不是加載過的熱數據,還需要進行數據頁的查找和替換,這其中可能牽涉到多次I/O
操作和內存中數據查找,導致耗時較高。
而MyISAM
存儲引擎只緩存索引文件,不緩存數據文件,其數據文件的緩存直接使用操作系統的緩存,這點非常獨特。此時相同的空間能夠加載更多的索引,因此當緩存空間有限時,MyISAM
的索引數據頁替換次數會更少。根據前面我們知道MyISAM
的文件分為MYI
和MYD
,當我們通過MYI
查找到主鍵ID
時,其實得到是MYD
數據文件的offset
偏移量,查找數據比InnoDB
尋址映射要快的多。
但由于MyISAM
是表鎖,而InnoDB
支持行鎖,因此在牽涉到大量寫操作時,InnoDB
的并發性能比MyISAM
好很多。同時InnoDB
還通過MVVC
多版本控制來提高并發讀寫性能。
delete
刪除數據
調用delete from table
時,MyISAM
會直接重建表,InnoDB
會一行一行的刪除,但是可以用truncate table
代替。參考: mysql清空表數據的兩種方式和區別。
鎖
MyISAM
僅支持表鎖,每次操作鎖定整張表。InnoDB
支持行鎖,每次操作鎖住最小數量的行數據。
表鎖相比于行鎖消耗的資源更少,且不會出現死鎖,但同時并發性能差。行鎖消耗更多的資源,速度較慢,且可能發生死鎖,但是因為鎖定的粒度小、數據少,并發性能好。如果InnoDB
的一條語句無法確定要掃描的范圍,也會鎖定整張表。
當行鎖發生死鎖的時候,會計算每個事務影響的行數,然后回滾行數較少的事務。
數據恢復
MyISAM
崩潰后無法快速的安全恢復。InnoDB
有一套完善的恢復機制。
數據緩存
MyISAM
僅緩存索引數據,通過索引查詢數據。InnoDB
不僅緩存索引數據,同時緩存數據信息,將數據按頁讀取到緩存池,按LRU(Latest Rare Use 最近最少使用)
算法來進行更新。
如何選擇存儲引擎
創建表的語句都是相同的,只有最后的type
來指定存儲引擎。
MyISAM
1、大量查詢總count
2、查詢頻繁,插入不頻繁
3、沒有事務操作
InnoDB
1、需要高可用性,或者需要事務
2、表更新頻繁
上述就是小編為大家分享的MySQL中InnoDB與MyISAM的區別了,如果您也有類似的疑惑,不妨礙參照上述分析進行理解。如果想了解更多相關內容,請關注億速云行業資訊。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。