<p>MyISAM、Memory、TokuDB 等其餘儲存引擎</p>
緊接上一小節,本小節重點介紹 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 屬於第三方儲存引擎,擁有高寫效能和高壓縮的特性。