亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

首頁 慕課教程 MySQL 進階教程 MySQL 進階教程 MyISAM、Memory、TokuDB等其余引擎

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

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

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

4. 小結

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

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