1. 程式人生 > >史上最簡單MySQL教程詳解(進階篇)之儲存引擎介紹及預設引擎設定

史上最簡單MySQL教程詳解(進階篇)之儲存引擎介紹及預設引擎設定

什麼是儲存引擎?

與其他資料庫例如Oracle 和SQL Server等資料庫中只有一種儲存引擎不同的是,MySQL有一個被稱為“Pluggable Storage Engine Architecture”(可替換儲存引擎架構)的特性,也就意味著MySQL資料庫提供了多種儲存引擎。使用者可以根據不同的需求為資料表選擇不同的儲存引擎,使用者也可以根據自己的需要編寫自己的儲存引擎。MySQL資料庫在實際的工作中其實分為了語句分析層和儲存引擎層,其中語句分析層就主要負責與客戶端完成連線並且事先分析出SQL語句的內容和功能,而儲存引擎層則主要負責接收來自語句分析層的分析結果,完成相應的資料輸入輸出和檔案操作。簡而言之,就是如何儲存資料、如何為儲存的資料建立索引和如何更新、查詢資料等技術的實現方法。因為在關係資料庫中資料的儲存是以表的形式儲存的,所以儲存引擎也可以稱為表型別(即儲存和操作此表的型別)。

MySQL儲存引擎種類

儲存引擎 說明
MyISAM 高速引擎,擁有較高的插入,查詢速度,但不支援事務
InnoDB 5.5版本後MySQL的預設資料庫,支援事務和行級鎖定,比MyISAM處理速度稍慢
ISAM MyISAM的前身,MySQL5.0以後不再預設安裝
MRG_MyISAM(MERGE) 將多個表聯合成一個表使用,在超大規模資料儲存時很有用
Memory 記憶體儲存引擎,擁有極高的插入,更新和查詢效率。但是會佔用和資料量成正比的記憶體空間。只在記憶體上儲存資料,意味著資料可能會丟失
Falcon 一種新的儲存引擎,支援事物處理,傳言可能是InnoDB的替代者
Archive 將資料壓縮後進行儲存,非常適合儲存大量的獨立的,作為歷史記錄的資料,但是隻能進行插入和查詢操作
CSV CSV 儲存引擎是基於 CSV 格式檔案儲存資料(應用於跨平臺的資料交換)

接下來我們就介紹兩種在實際開發中使用最多的兩種引擎【MyISAM】和【InnoDB】。

MyISAM 引擎

這種引擎是MySQL最早提供的。這種引擎又可以分為靜態MyISAM、動態MyISAM 和壓縮MyISAM三種:

  • 靜態MyISAM:如果資料表中的各資料列的長度都是預先固定好的,伺服器將自動選擇這種表型別。因為資料表中每一條記錄所佔用的空間都是一樣的,所以這種表存取和更新的效率非常高。當資料受損時,恢復工作也比較容易做。
  • 動態MyISAM:如果資料表中出現varchar、xxxtext或xxxBLOB欄位時,伺服器將自動選擇這種表型別。相對於靜態MyISAM,這種表儲存空間比較小,但由於每條記錄的長度不一,所以多次修改資料後,資料表中的資料就可能離散的儲存在記憶體中,進而導致執行效率下降。同時,記憶體中也可能會出現很多碎片。因此,這種型別的表要經常用optimize table 命令或優化工具來進行碎片整理。
  • 壓縮MyISAM:以上說到的兩種型別的表都可以用myisamchk工具壓縮。這種型別的表進一步減小了佔用的儲存,但是這種表壓縮之後不能再被修改。另外,因為是壓縮資料,所以這種表在讀取的時候要先時行解壓縮。

當然不管是何種MyISAM表,目前它都不支援事務,行級鎖和外來鍵約束的功能,這就意味著有事務處理需求的表,不能使用MyISAM儲存引擎。MyISAM儲存引擎特別適合在以下幾種情況下使用:

  • 選擇密集型的表。MyISAM儲存引擎在篩選大量資料時非常迅速,這是它最突出的優點。
  • 插入密集型的表。MyISAM的併發插入特性允許同時選擇和插入資料。

MyISAM表是獨立於作業系統的,這說明可以輕鬆地將其從Windows伺服器移植到Linux伺服器;每當我們建立一個MyISAM引擎的表時,就會在本地磁碟上建立三個檔案,檔名就是表名。 例如我建立了一個【test】表,那麼就會生成以下三個檔案:

檔名 說明
test.frm 儲存表定義
test.MYD 儲存資料
test.MYI 儲存索引

InnoDB引擎

InnoDB表型別可以看作是對MyISAM的進一步更新產品,它提供了事務、行級鎖機制和外來鍵約束的功能。InnoDB的表需要更多的記憶體和儲存,它會在主記憶體中建立其專用的緩衝池用於高速緩衝資料和索引。
使用InnoDB是最理想的選擇:

  • 更新密集的表:InnoDB儲存引擎特別適合處理多重併發的更新請求。
  • 事務:InnoDB儲存引擎是支援事務的標準MySQL儲存引擎。
  • 自動災難恢復:與其它儲存引擎不同,InnoDB表能夠自動從災難中恢復。
  • 外來鍵約束:MySQL支援外來鍵的儲存引擎只有InnoDB。
  • 支援自動增加列AUTO_INCREMENT屬性。

儲存引擎操作

檢視儲存引擎

想要檢視我們的資料表使用了什麼儲存引擎,我們就需要使用到我們以前已經介紹過的【show】命令,語法如下:

SHOW CREATE TABLE 表名;

例如我們檢視我們之前建立好的【user】表:

SHOW CREATE TABLE user;
+——-+—————————————————————————————————————————————————————————————————————————-+
| Table | Create Table |
+——-+—————————————————————————————————————————————————————————————————————————-+
| user | CREATE TABLE user (
userId char(5) CHARACTER SET latin1 NOT NULL,
name varchar(30) DEFAULT NULL,
sex char(1) CHARACTER SET latin1 DEFAULT ‘0’,
PRIMARY KEY (userId)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+——-+—————————————————————————————————————————————————————————————————————————-+
1 row in set (0.02 sec)

就可以看到【 ENGINE】顯示我們使用的引擎為【MyISAM】

儲存引擎的變更

變更我們儲存表的儲存引擎將使用到的是我們前面使用過的【ALTER】命令,語法如下:

ALTER TABLE 表名 ENGINE=新引擎;

例如,我們將【user】表的引擎更改為【InnoDB】:

mysql> ALTER TABLE user ENGINE = InnoDB;
Query OK, 7 rows affected (0.50 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE user;
+——-+—————————————————————————————————————————————————————————————————————————-+
| Table | Create Table |
+——-+—————————————————————————————————————————————————————————————————————————-+
| user | CREATE TABLE user (
userId char(5) CHARACTER SET latin1 NOT NULL,
name varchar(30) DEFAULT NULL,
sex char(1) CHARACTER SET latin1 DEFAULT ‘0’,
PRIMARY KEY (userId)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+——-+—————————————————————————————————————————————————————————————————————————-+
1 row in set (0.00 sec)

我們就成功的將【user】表的儲存引擎改為了【InnoDB】

修改預設引擎

要使用事務功能,就必須將表設定為InnoDB引擎,有的版本在安裝時,是未啟用InnoDB引擎的,所以需要我們手動進行啟用。首先我們進入MySQL的安裝目錄,找到my.ini檔案。例如,博主使用的是WampServer的整合開發環境,目錄如下:
這裡寫圖片描述
我們右鍵選擇記事本開啟後,找到【default-storage-engine】這一行,如圖:
這裡寫圖片描述
將其修改為【default-storage-engine=InnoDB】即可,我們就成功的將預設的引擎修改為【InnoDB】。

這裡,我們就講解完了關於MySQL資料庫儲存引擎的有關知識,同時也為我們下一步講解史上最簡單MySQL教程詳解(進階篇)之事務處理做好了鋪墊,因為要實現事務管理,需要將表的儲存引擎更改為【InnoDB】