12、MyISAM存储引擎
MyISAM 存儲引擎是 MySQL 中常見的存儲引擎,曾(MySQL 5.1及之前版本)是 MySQL 的默認存儲引擎。
MyISAM 是基于 ISAM 存儲引擎發展起來的。實際上那會還沒有存儲引擎的概念,ISAM 只是一種算法,或者說是數據的處理方式。如同 SQL Server/Oracle 這類產品一樣,MySQL 對表對象的管理方式只有一種。隨著 MySQL 架構的不斷發展和演進,最終才引入插件式存儲引擎的概念,ISAM 也進化為 MyISAM 并一直作為 MySQL 數據庫的默認存儲引擎,直到 MySQL 5.5 版本才被 InnoDB 引擎取代了默認存儲引擎的地位。
下面主要從優缺點和物理存儲等方面來介紹 MyISAM 存儲引擎。
優缺點
作為 MySQL 最早的存儲引擎之一,MyISAM 有一些已經開發出來很多年的特性,可以滿足用戶的實際需求。例如全文索引、壓縮、空間函數(GIS)等。但 MySQL 官方的重心早就不在 MyISAM 引擎上了,所以近些年來,MyISAM 一直沒有很大的改進,也存在著許多的缺陷。
優點
- 占用空間小
- 訪問速度快,對事務完整性沒有要求或以 SELECT、INSERT 為主的應用基本上都可以使用這個引擎來創建表
- 可以配合鎖,實現操作系統下的復制備份
- 支持全文檢索(InnoDB 在 MySQL 5.6 版本以后也支持全文檢索)
- 數據緊湊存儲,因此可獲得更小的索引和更快的全表掃描性能。
1. 加鎖與并發
MyISAM 對整張表加鎖,而不是針對行。讀取時會對需要讀到的所有表加共享鎖,寫入時對表加排他鎖。但是在表有讀取查詢的同時,也可以往表中插入新的記錄(這被稱為并發插入)。
2. 修復
對于 MyISAM 表,MySQL 可以手工(執行命令 CHECK TABLE tablename)或者自動執行檢查和修復(執行命令 REPAIR TABLE tablename)操作,但這里說的修復和事務恢復以及崩潰修復是不同的概念。
另外,如果 MySQL 服務器已經關閉,也可以通過 myisamchk 命令行工具進行檢查和修復操作。
3. 索引特性
MyISAM 支持以下 3 種類型的索引:
1)B-Tree 索引
B-Tree 索引,顧名思義,就是所有的索引節點都按照 balance tree 的數據結構來存儲,所有的索引數據節點都在葉節點。
2)R-Tree 索引
R-Tree 索引的存儲方式和 b-tree 索引有一些區別,主要設計用于為存儲空間和多維數據的字段做索引,所以對于目前的 MySQL 版本來說,也僅支持 geometry 類型的字段作索引。
3)Full-text 索引
Full-text 索引就是全文索引,它的存儲結構也是 b-tree。主要是為了解決需要用 like 查詢時的低效問題。
MyISAM 上面三種索引類型中,最經常使用的就是 B-Tree 索引了,偶爾會使用到 Full-text,但是 R-Tree 索引一般系統中都是很少用到的。另外 MyISAM 的 B-Tree 索引有一個較大的限制,那就是參與一個索引的所有字段的長度之和不能超過 1000 字節。
缺點
- 不支持事務的完整性和并發性
- 不支持行級鎖,使用表級鎖,并發性差
- 主機宕機后,MyISAM表易損壞,災難恢復性不佳
- 數據庫崩潰后無法安全恢復
- 只緩存索引,數據的緩存是利用操作系統緩沖區來實現的,可能會引發過多的系統調用,且效率不佳
物理存儲
MyISAM 存儲引擎的表在數據庫中被存儲成 3 個物理文件,文件名與表名相同。擴展名為 frm、MYD 和 MYI。其中:
- frm 為擴展名的文件存儲表的結構;
- MYD 為擴展名的文件存儲數據,其是 MYData 的縮寫;
- MYI 為擴展名的文件存儲索引,其是 MYIndex 的縮寫。不管表有多少索引,都是存放在同一個 .MYI 文件中。
MyISAM 類型的數據文件和索引文件可以放置在不同的目錄,平均分布 IO,以此來獲得更快的速度。
要指定索引文件和數據文件的路徑,需要在創建表的時候通過 DATA DIRECTORY 和 INDEX DIRECTORY 語句指定,也就是說不同 MyISAM 表的索引文件和數據文件可以放置到不同的路徑下。文件路徑需要是絕對路徑,并且具有訪問權限。
雖然每一個 MyISAM 的表數據都存放在后綴名為 .MYD 的文件中,但是每個文件的存放格式可能并不完全一樣。因為 MyISAM 支持 3 種不同的數據存放格式,即靜態型、動態型和壓縮型。
1)靜態型
靜態型為 MyISAM 存儲引擎的默認存儲格式,其字段是固定長度,這樣每個記錄都是固定長度的,這種存儲方式存儲非常迅速,容易緩存,出現故障容易恢復。缺點是占用的空間比動態表多。靜態型的表的數據在存儲的時候會按照列的寬度定義去補足空格,但是在應用訪問的時候并不會得到這些空格,空格在返回給應用之前就被去掉了。
需要注意的是,如果需要保存的內容后面本來就帶有空格,那么在返回結果的時候也會被去掉。這一點開發人員在編寫程序的時候需要特別注意,因為靜態表是默認的存儲格式,開發人員可能并沒有意識到這一點,從而丟失了尾部的空格。
2)動態型
動態型包含變長字段,記錄的長度不是固定的。這樣存儲的優點是占用的空間相對較少,但是頻繁的更新刪除記錄會產生碎片,需要定期執行 OPTIMIZE TABLE 語句或 myisamchk -r 命令來改善性能,并且出現故障的時候恢復相對比較困難。
3)壓縮型
與上面兩種格式相比,壓縮型的表就顯得特殊一些。壓縮型的表需要使用 myisampack 工具創建,解壓縮則用另外的 myisamchk 命令。壓縮表是制度的,不支持添加或修改記錄。
壓縮表是基于靜態或動態格式表的,優點在于占用的磁盤空間非常小,可以減少磁盤 I/O,從而提升查詢性能。因為每個記錄都是被單獨壓縮的,所以只有非常小的開支。
理論上,MyISAM 存儲引擎的表可以被多個數據庫實例同時使用同時操作,但是一般不建議這樣做,關于這點,MySQL 官方的用戶手冊中也有提到,建議盡量不要在多個 mysqld 之間共享 MyISAM 存儲文件。
如果表在創建并導入數據以后,不會再進行修改操作,這樣的表或許適合采用 MyISAM 壓縮表。
總結
以上是生活随笔為你收集整理的12、MyISAM存储引擎的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 11、InnoDB存储引擎
- 下一篇: 13、不同存储引擎的数据表在文件系统里是