MySql------存储引擎(InnoDB,ISAM)
MySql存儲引擎
- 導讀
- InnoDB存儲引擎
- 一、存儲結構
- 二、存儲空間消耗
- 三、對事務支持情況
- 四、對鎖支持
- 五、表行數
- MyISAM存儲引擎
- 一、存儲結構
- 二、存儲空間消耗
- 三、對事務支持情況
- 四、對鎖支持
- 五、表行數
- 為什么MyISAM會比Innodb 的查詢速度快
- 應用場景選擇
導讀
MySQL支持的存儲引擎很多,其中包括MyISAM、InnoDB、MERGE、EXAMPLE、BDB、ARCHIVE、MEMORY、NDB Cluster等,其中InnoDB和BDB支持事務安全。同時MySql還支持一些第三方的存儲引擎,例如TokuDB(高寫性能高壓縮存儲引擎)、Infobright(列式存儲引擎)。本文主要講InnoDB和MyISAM這兩個普遍使用的存儲引擎之間差異,選擇場景。
InnoDB存儲引擎
InnoDB是MySQL最常用的數據庫引擎,是MySQL AB發布binary的標準之一。InnoDB存儲引擎由Innobase Oy公司所開發,在2006年五月時被甲骨文公司并購。與傳統的ISAM與MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事務(Transaction)功能,類似于PostgreSQL。
一、存儲結構
所有的表都保存在同一個數據文件中(也可能是多個文件,或者是獨立的表空間文件),.frm文件同樣存儲為表結構文件,.ibd文件存儲的是數據和索引文件,InnoDB表的大小只受限于操作系統文件的大小,一般為2GB。
InnoDB支持聚簇索引和非聚簇索引
二、存儲空間消耗
InnoDB會在主內存中建立其專用的緩沖池用于高速緩沖數據和索引。InnoDB表的大小只受限于操作系統文件的大小,一般為2GB。
三、對事務支持情況
擁有外鍵和事務支持,還具有事務提交(commit)、回滾(rollback)和崩潰修復能力(crach recovery capabilities)等這些事務安全(transaction-safe ACID compliant)型表。
InnoDB中必須包含主鍵索引。引擎的自動增長列必須是索引,如果是組合索引也必須是組合索引的第一列。
四、對鎖支持
InnoDB存儲引擎支持表鎖,行鎖,行鎖可以大幅度提高用戶并發操作。對于 InnoDB 引擎來說,讀鎖和寫鎖可以加在表上,也可以加在行上。
對于并發讀和并發寫的問題,可以通過實現一個由兩種類型的鎖組成的鎖系統來解決。這兩種類型的鎖通常被稱為 共享鎖(Shared Lock,S Lock) 和 排他鎖(Exclusive Lock,X Lock),也叫 讀鎖(readlock) 和 寫鎖(write lock):
共享鎖 / 讀鎖:允許事務讀(select)數據
排他鎖 / 寫鎖:允許事務刪除(delete)或更新(update)數據
InnoDB 存儲引擎的行級鎖是基于索引的,也就是說當索引失效或者說根本沒有用索引的時候,行鎖就會升級成表鎖。
五、表行數
沒有保存表的總行數,如果使用select count(*) from table;就會遍歷整個表,消耗相當大,但是在加了wehre條件后,myisam和innodb處理的方式都一樣。
MyISAM存儲引擎
MyISAM是MySQL(5.5版之前)的默認數據庫引擎,由早期的ISAM(Indexed Sequential Access Method:有索引的順序訪問方法)改良。雖然查詢性能優良,但有個缺點:不支持事務(transaction)。所以最近幾年逐漸引入了InnoDB(另一種數據庫引擎),后來就逐漸取代MyISAM。
一、存儲結構
每個MyISAM在磁盤上存儲成三個文件,它們以表的名字開頭來命名。.frm文件存儲表定義。.MYD(MYD)存儲數據文件。.MYI(MYIndex)存儲索引文件。
MyISAM只支持非聚簇索引
二、存儲空間消耗
MyISAM存儲空間是可被壓縮,存儲空間占用較小。MyISAM支持三種存儲格式:靜態表(默認,但是注意數據末尾不能有空格,會被去掉)、動態表、壓縮表。
三、對事務支持情況
MyISAM強調的是性能,每次查詢具有原子性,其執行速度比Innodb類型更快,但是不提供事務支持。
可以和其他字段一起建立聯合索引。引擎的自動增長列必須是索引,如果是組合索引,自動增長可以不是第一列,他可以根據前面幾列進行排序后遞增。
四、對鎖支持
只支持表級鎖,用戶在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖,如果加鎖以后的表滿足insert并發的情況下,可以在表的尾部插入新的數據。
五、表行數
保存有表的總行數,如果select count(*) from table;會直接取出出該值。
為什么MyISAM會比Innodb 的查詢速度快
INNODB在做查詢的時候,要維護的東西比MYISAM引擎多
1)INNODB要緩存數據塊,MYISAM只緩存索引塊, 這中間還有換進換出的減少;
2)innodb尋址要映射到塊,再到行,MYISAM 記錄的直接是文件的OFFSET,定位比INNODB要快
3)INNODB還需要維護MVCC一致;雖然你的場景沒有,但他還是需要去檢查和維護
應用場景選擇
MyISAM適合: (1)做很多count 的計算; (2)插入不頻繁,查詢非常頻繁; (3)沒有事務。 InnoDB適合: (1)可靠性要求比較高,或者要求事務; (2)表更新和查詢都相當的頻繁,并且行鎖定的機會比較大的情況。總結
以上是生活随笔為你收集整理的MySql------存储引擎(InnoDB,ISAM)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue中img的动态src不显示图片
- 下一篇: en开头的单词_大道至简:为什么记英语单