1. 程式人生 > MYSQL進階教學 ><p>MyISAM、Memory、TokuDB 等其餘儲存引擎</p>

<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 與 InnoDB 的對比

一般來說,TokuDB比較適用以下場景:

  • 訪問頻率不高的資料或歷史資料歸檔;
  • 資料表非常大並且時不時還需要進行DDL操作。

4. 小結

本節主要學習了 MyISAM、Memory、TokuDB 這三種儲存引擎。本節課程的重點如下:

  • MyISAM 的特性主要包括:加鎖與併發、延遲更新索引鍵、壓縮和修復等;
  • Memory 查詢資料的效率非常高,但是寫的效能很差;
  • TokuDB 屬於第三方儲存引擎,擁有高寫效能和高壓縮的特性。