再也不怕面試官問《MySQL的存儲引擎》了

導語

在數據庫中存的就是一張張有着千絲萬縷關係的表,所以表設計的好壞,將直接影響着整個數據庫。在設計表的時候,我們都會先關注一個問題,具體使用什麼存儲引擎比較好。那麼,存儲引擎是什麼呢?這篇文章將對MySQL的存儲引擎做一個詳細的介紹。

1,什麼是存儲引擎呢?

首先需要確定一點,存儲引擎的概念是MySQL裏面纔有的,並不是所有的關係型數據庫都有存儲引擎這個概念。 對於用戶和應用程序來說同樣一張表的數據,無論用什麼引擎來存儲,用戶能夠看到的數據是一樣的。不同儲引擎存取,引擎功能,佔用空間大小,讀取性能等可能有區別。說白了,存儲引擎就是在如何存儲數據、提取數據、更新數據等技術方法的實現上,底層的實現方式不同,那麼就會呈現出不同存儲引擎有着一些自己獨有的特點和功能,對應着不同的存取機制。
  因爲在關係數據庫中數據的存儲是以表的形式存儲的,所以存儲引擎也可以稱爲表類型(即:對錶的存儲、操作等的實現方法不同),表是什麼,表本質上就是磁盤上的文件。

其實MySQL支持多種存儲引擎,每種引擎有着一些自己獨特的功能,用戶在使用的時候,可以根據自己的業務場景來使用不同的存儲引擎,其中MySQL最常用的存儲引擎爲:MyISAM和InnoDB。

在詳細介紹這些存儲引擎之前,我們先來看看MySQL的整個工作流程,看一下存儲引擎在哪裏,MySQL都做了哪些事情。

在這裏插入圖片描述

2,MySQL存儲引擎分類

前面我們對MySQL進行操作的時候並沒有指定存儲引擎,爲什麼還能用呢,沒有指定還能用,說明什麼,說明MySQL默認有一個存儲引擎,我記得MySQL5.5之前,默認的存儲引擎是MyISAM,之後都改爲InnoDB了,我們的重點就是這個InnoDB,也是公司中最常用的、最好用的引擎,但是還是一些公司在用MyISAM引擎,除了歷史原因之外,還有MyISAM的效率比InnoDB高一點,InnoDB在這方面做了很多優化,效率已經和MyISAM差不多了,但是InnoDB引擎還有好多其他的NB的功能,下面我們就介紹幾種存儲引擎。

首先,看一下數據庫的存儲引擎:
在這裏插入圖片描述

不同的引擎代表着不同的存取機制,那麼有哪些引擎呢,連接進入mysql之後,查看MySQL支持的所有存儲引擎:

1,查看所有引擎

mysql> show engines;

在這裏插入圖片描述

工作中最常用的是Innodb,因爲從上面圖上可以看出,它支持的功能:事務、行級鎖、外鍵等。

2,查看當前正在使用的引擎

mysql> show variables like "storage_engine%";

在這裏插入圖片描述

注意: 在存儲大文件的時候,可以存到數據庫,但是儘量別直接存到數據庫裏面,會影響數據庫的效率,我們就存文件的路徑、地址,用戶想要這個大文件,我們可以到對應的路徑下取讀取這個文件給用戶。

3,MySQL的四種存儲引擎的介紹

1,MyISAM存儲引擎

不支持事務,也不支持外鍵,優勢就是訪問速度快,對事務完整性沒有要求或者以select,insert爲主的應用基本上可以用這個引擎來創建表。

支持3種不同的存儲格式,分別是:靜態表;動態表;壓縮表。

  • 靜態表:表中的字段都是非變長字段,這樣每個記錄都是固定長度的,優點存儲非常迅速,容易緩存,出現故障容易恢復;缺點是佔用的空間通常比動態表多(因爲存儲時會按照列的寬度定義補足空格)ps:在取數據的時候,默認會把字段後面的空格去掉,如果不注意會把數據本身帶的空格也會忽略。
  • 動態表:記錄不是固定長度的,這樣存儲的優點是佔用的空間相對較少;缺點:頻繁的更新、刪除數據容易產生碎片,需要定期執行OPTIMIZE TABLE或者myisamchk-r命令來改善性能。
  • 壓縮表:因爲每個記錄是被單獨壓縮的,所以只有非常小的訪問開支。

默認的MySQL插件式存儲引擎。如果應用是以讀操作和插入操作爲主,只有很少的更新和刪除操作,並且對事務的完整性、併發性要求不是很高,那麼選擇這個存儲引擎是非常適合的。MyISAM是在Web、數據倉儲和其他應用環境下最常使用的存儲引擎之一。

2,InnoDB存儲引擎

該存儲引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。但是對比MyISAM引擎,寫的處理效率會差一些,並且會佔用更多的磁盤空間以保留數據和索引。

InnoDB是一個健壯的事務型存儲引擎,這種存儲引擎已經被很多互聯網公司使用,爲用戶操作非常大的數據存儲提供了一個強大的解決方案。我的電腦上安裝的MySQL 5.5.31版,InnoDB就是作爲默認的存儲引擎。InnoDB還引入了行級鎖定和外鍵約束,在以下場合下,使用InnoDB是最理想的選擇:

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

InnoDB存儲引擎的特點: 支持自動增長列,支持外鍵約束。

一般來說,如果需要事務支持,並且有較高的併發讀取頻率,InnoDB是不錯的選擇。採用事務日誌,系統崩潰後易於數據的恢復。

3,MEMORY存儲引擎

使用MySQL Memory存儲引擎的出發點是速度。爲得到最快的響應時間,採用的邏輯存儲介質是系統內存。雖然在內存中存儲表數據確實會提供很高的性能,但當mysqld守護進程崩潰時,所有的Memory數據都會丟失。獲得速度的同時也帶來了一些缺陷。它要求存儲在Memory數據表裏的數據使用的是長度不變的格式,這意味着不能使用BLOB和TEXT這樣的長度可變的數據類型,VARCHAR是一種長度可變的類型,但因爲它在MySQL內部當做長度固定不變的CHAR類型,所以可以使用。

一般在以下幾種情況下使用Memory存儲引擎:

  1. 目標數據較小,而且被非常頻繁地訪問。在內存中存放數據,所以會造成內存的使用,可以通過參數max_heap_table_size控制Memory表的大小,設置此參數,就可以限制Memory表的最大大小。
  2. 如果數據是臨時的,而且要求必須立即可用,那麼就可以存放在內存表中。
  3. 存儲在Memory表中的數據如果突然丟失,不會對應用服務產生實質的負面影響。

Memory同時支持散列索引和B樹索引。B樹索引的優於散列索引的是,可以使用部分查詢和通配查詢,也可以使用<、>和>=等操作符方便數據挖掘。散列索引進行“相等比較”非常快,但是對“範圍比較”的速度就慢多了,因此散列索引值適合使用在=和<>的操作符中,不適合在<或>操作符中,也同樣不適合用在order by子句中。

create table users
(
    id smallint unsigned not null auto_increment,
    username varchar(15) not null,
    pwd varchar(15) not null,
    index using hash (username),
    primary key (id)
)engine=memory;

上述代碼創建了一個表,在username字段上使用了HASH散列索引。下面的代碼就創建一個表,使用BTREE索引。

create table users
(
    id smallint unsigned not null auto_increment,
    username varchar(15) not null,
    pwd varchar(15) not null,
    index using btree (username),
    primary key (id)
)engine=memory;

將所有數據保存在 RAM 中,而且支持Hash索引,在需要快速定位記錄和其他類似數據的環境下,可提供極快的訪問。MEMORY 的缺陷是對錶的大小有限制,太大的表無法 CACHE 在內存中 ,而且不支持BLOB,TEXT 類型,而且使用的表級鎖,併發性能低。現在很少使用,一般用於作爲中間表保存中間數據。

4,MERGE存儲引擎

MERGE存儲引擎是一組MyISAM表的組合,這些MyISAM表結構必須完全相同,儘管其使用不如其它引擎突出,但是在某些情況下非常有用。說白了,Merge表就是幾個相同MyISAM表的聚合器;Merge表中並沒有數據,對Merge類型的表可以進行查詢、更新、刪除操作,這些操作實際上是對內部的MyISAM表進行操作。Merge存儲引擎的使用場景。

對於服務器日誌這種信息,一般常用的存儲策略是將數據分成很多表,每個名稱與特定的時間端相關。例如:可以用12個相同的表來存儲服務器日誌數據,每個表用對應各個月份的名字來命名。當有必要基於所有12個日誌表的數據來生成報表,這意味着需要編寫並更新多表查詢,以反映這些表中的信息。與其編寫這些可能出現錯誤的查詢,不如將這些表合併起來使用一條查詢,之後再刪除Merge表,而不影響原來的數據,刪除Merge表只是刪除Merge表的定義,對內部的表沒有任何影響。

MERGE 表的優點在於可以突破對單個 MyISAM 表大小的限制,並且通過將不同的表分佈在多個磁盤上,可以有效地改善 MERGE 表的訪問效率。這對於諸如數據倉儲等VLDB環境十分適合。

5,ARCHIVE存儲引擎

Archive是歸檔的意思,在歸檔之後很多的高級功能就不再支持了,僅僅支持最基本的插入和查詢兩種功能。在MySQL 5.5版以前,Archive是不支持索引,但是在MySQL 5.5以後的版本中就開始支持索引了。Archive擁有很好的壓縮機制,它使用zlib壓縮庫,在記錄被請求時會實時壓縮,所以它經常被用來當做倉庫使用。

4,如何選擇合適的存儲引擎

選擇的標準可以分爲:

(1)是否需要支持事務。

(2)是否需要使用熱備。

(3)崩潰修復:能否接受甭崩潰。

(4)是否需要外鍵支持。

敲黑板: 除非需要InnoDB 不具備的特性,並且沒有其他辦法替代,否則都應該優先考慮InnoDB;或者,不需要InnoDB的特性,並且其他的引擎更加合適當前情況,例如 多讀少寫,對數據恢復要求不高,反而是 對存儲空間要求較高。

總結

這篇文章總結了幾種比較常用的存儲引擎,對於實際的工作,需要根據具體的情況而定,結合實際的項目實例進行應用,纔是最好的學習方法。由於純手打,難免會有紕漏,如果發現錯誤的地方,請第一時間告訴我,這將是我進步的一個很重要的環節。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章