MyISAM、Memory、TokuDB 等其余存儲引擎
緊接上一小節,本小節重點介紹 MyISAM、Memory、TokuDB 的特性。
1. MyISAM
在 MySQL 5.5 之前的版本,MyISAM 是默認的存儲引擎。MyISAM 提供了全文索引、壓縮、空間函數(GIS)等特性,但 MyISAM 不支持事務和行級鎖,而且 MyISAM 沒有 crash-safe 的能力。MySQL 5.6之后,MyISAM已經越來越少被使用。
Tips: crash-safe 指數據庫發生故障重啟,之前提交的數據不會丟失。
1.1 MyISAM特性
- 加鎖與并發
MyISAM 可以對整張表加鎖,而不是針對行。讀數時會對表加共享鎖,寫入時對表加排它鎖。在表有讀取查詢的同時,也可以對表進行插入數據。
- 延遲更新索引鍵
創建 MyISAM 表時,可以指定 DELAY_KEY_WRITE 選項,在每次更新完成時,不會馬上將更新的索引數據寫入磁盤,而是先寫到內存中的鍵緩沖區,當清理鍵緩沖區或關閉表的時候,才將對應的索引塊寫入磁盤。這種方式可以極大地提升寫入性能。
- 壓縮
可以使用 myisampack 工具對 MyISAM 表進行壓縮。壓縮表可以極大地減少磁盤空間使用,從而減少磁盤 IO,提升查詢性能。壓縮表時不能進行數據的修改。表中的記錄是獨立壓縮的,讀取單行時,不需要解壓整個表。
一般來說,如果數據在插入之后,不再進行修改,這種表比較適合進行壓縮,如日志記錄表、流水記錄表。
- 修復
針對 MyISAM 表,MySQL 可以手工或自動執行檢查和修復操作。執行表的修復可能會導致丟失一些數據,而且整個過程非常緩慢。
可以通過check table xxx檢查表的錯誤,如果有錯誤,則通過repair table xxx進行修復。在 MySQL 服務器關閉的情況下,也可以通過 myisamchk 命令行工具進行檢查和修復操作。
mysql> create table t1(
-> c1 int not null,
-> c2 varchar(10) default null
-> ) engine = myisam;
Query OK, 0 rows affected (0.06 sec)
mysql> check table t1;
+-----------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-----------+-------+----------+----------+
| tempdb.t1 | check | status | OK |
+-----------+-------+----------+----------+
1 row in set (0.00 sec)
mysql> repair table t1;
+-----------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-----------+--------+----------+----------+
| tempdb.t1 | repair | status | OK |
+-----------+--------+----------+----------+
1 row in set (0.00 sec)
1.2 存儲方式
MyISAM 在磁盤中存儲成 3 個文件,文件名和表名相同
- .frm-存儲表定義 ;
- .MYD-存儲數據;
- .MYI-存儲索引。
下面為 MyISAM 表的創建語句,及相應的數據文件:
mysql> create table a (id int) ENGINE = MyISAM;
Query OK, 0 rows affected (0.01 sec)
[root@mysql-test-1 tempdb]# ls -lrt a.*
-rw-r----- 1 mysql mysql 8556 Apr 13 02:01 a.frm
-rw-r----- 1 mysql mysql 1024 Apr 13 02:01 a.MYI
-rw-r----- 1 mysql mysql 0 Apr 13 02:01 a.MYD
2. Memory
Memory 使用內存中的內容來創建表,每個 Memory 表只有一個 .frm 文件。如果需要快速訪問數據,并且數據不會被修改,丟失也沒有關系,使用 Memory 是非常適合的。而且 Memory 表支持 Hash 索引,查找操作非???。
即便如此,Memory 表也無法取代基于磁盤的表
- Memory 表是表級鎖,并發寫的性能較差;
- 不支持BLOB或TEXT類型的列,并且每行的長度是固定的,即使指定了varchar列,實際存儲也會使用char列。
一般來說,Memory 表比較適合以下場景:
- 用于查找或映射表,如郵編、省市區等變化不頻繁的表;
- 用于緩存周期性聚合數據的表;
- 用于統計操作的中間結果表。
3. TokuDB
除了 MySQL 自帶的存儲引擎之外,還有一些常見的第三方存儲引擎,如列式存儲引擎 Infobright、高寫性能和高壓縮的 TokuDB。TokuDB 是一個高效寫入、高壓縮率、高擴展性、支持事務處理的存儲引擎,最新的版本可以在 Percona Server for MySQL 中使用。
下圖是官方給出的 TokuDB 與 InnoDB 的對比:
一般來說,TokuDB比較適用以下場景:
- 訪問頻率不高的數據或歷史數據歸檔;
- 數據表非常大并且時不時還需要進行DDL操作。
4. 小結
本節主要學習了 MyISAM、Memory、TokuDB 這三種存儲引擎。本節課程的重點如下:
- MyISAM 的特性主要包括:加鎖與并發、延遲更新索引鍵、壓縮和修復等;
- Memory 查找數據的效率非常高,但是寫的性能很差;
- TokuDB 屬于第三方存儲引擎,擁有高寫性能和高壓縮的特性。