一文帶你看懂 MySQL 存儲引擎


1.MySQL體系結構

       開篇先來一張MySQL體系圖,讓你來了解一下存儲引擎所在的位置。如果你對 MySQL 體系結構還不是很熟悉,你可以查看圖片中的備註信息。你也可以跳轉到:瞭解MySQL體系結構 來具體瞭解專業名詞的介紹。
在這裏插入圖片描述

2.存儲引擎介紹

       關係型數據庫,就是用來存儲各種數據信息的。根據不同業務場景,比如說:有的表簡單,有的表複雜,有的表根本不用來存儲任何長期的數據,有的表需要查詢非常快。在我們實際的業務開發中,可能需要用到各種各樣的表,不同的表也意味着存儲不同類型的數據,數據的處理上也就會存在着差異。針對 MySQL 來說,它提供了很多類型的存儲引擎來供我們選擇,我們可以數據業務需求來選擇不同的存儲引擎,最大程度的發揮 MySQL 的強大之處。

3.MySQL 存儲引擎特性

  1. 採用的是插拔式的插件方式;
  2. 存儲引擎是指定在表之上的,即一個庫中的每一個表都可以指定選擇存儲引擎
  3. 不管表採用什麼樣的存儲引擎,都會在數據區,產生對應的一個.frm文件(表結構定義描述文件,下文有介紹)

4.MySQL 有哪些存儲引擎

       我們可以使用命令:show engines;來查看 MySQL 支持哪些存儲引擎,如下圖所示。我們可以看到 MySQL 默認使用的存儲引擎是 InnoDB(下圖 MySQL 使用的版本爲5.7.28)。

       注意:在MySQL 5.5之前默認的存儲引擎是 MyISAM,5.5版本及以後默認存儲引擎修改爲 InnoDB,具體5.5.x 哪個小版本號不清楚,討論這也沒什麼意義)。

       在工作中,經常用到的還是InnoDBMyISAM這兩種,其他存儲引擎在指定一些場景下會更加的高效。接下來就從幾個方面來對InnoDBMyISAMCSVArchiveMemory 這五種存儲引擎做一個基本的瞭解。
在這裏插入圖片描述

5.瞭解 MySQL 數據存儲方式

       在開篇已經瞭解到,MySQL使用的是硬盤來進行數據存儲的。那麼它最終存儲在哪個地方了呢?這個可以在我們搭建 MySQL 數據庫時指定,我們也可以通過命令:show variables like 'datadir’來查看具體存儲爲止。(此處命令是兩個單引號,CSDN MarkDown編輯器的問題)
在這裏插入圖片描述
       進入/usr/local/mysql/data 目錄,再進入到 db_store 目錄下,我們便能夠很真實的看到數據庫中的數據在硬盤中存儲。如下圖所示。在進入文件夾,便是具體的數據庫表信息了。在這裏插入圖片描述
在這裏插入圖片描述

6.MySQL存儲引擎介紹

Tips:以下所有內容,基於 MySQL 5.7.28 版本介紹(CSV、Archive、Memory、InnoDB、MyISAM。其它引擎就不過多介紹)

6.1 CSV存儲引擎

6.1.1 CSV介紹

CSV存儲引擎,數據是以CSV文件存儲。
 
特點:

  1. 不能定義索引,列定義必須爲NOT NULL,不能設置自增列;(缺點:不適用於大表或者數據查詢、排序等處理操作)
  2. CSV數據的存儲需要用,逗號隔開,可直接編輯 CSV文件進行數據的編排(缺點:數據安全性低)
  3. 可以對硬盤中保存的表文件數據進行直接編輯xxx.CSV文件,但是不能將該文件刪除然後上傳自己的同名.CSV文件(該文件中可能還有額外一些和表相關的數據),我們只能對其中數據進行編輯操作。編輯之後,通過命令:flush table XXX表名的方式使其生效

應用場景:

  1. 數據的快速導入導出;
  2. 表格直接轉換成CSV;

6.1.2 使用CSV存儲引擎建表語句

CREATE TABLE `users_csv` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  `address` varchar(255) NOT NULL
) ENGINE=csv

6.1.3 查看數據所在硬盤位置

  通過上文5.瞭解 MySQL 數據存儲方式,進入到存儲數據所在的硬盤下,便可以看到 users_csv 相關的表(.frm 爲表結構文件;.CSV爲數據文件,.CSM不瞭解是幹嘛的)
在這裏插入圖片描述

6.2 Archive存儲引擎

6.2.1 Archive介紹

Archive存儲引擎,是以壓縮協議進行數據的存儲
 
特點:

  1. 只支持 insert 和 select 兩種操作;(缺點:不適用於對數據的處理操作)
  2. 只允許自增ID列建立索引(缺點:還是不方便數據的處理)
  3. 支持行級鎖
  4. 不支持事務
  5. 優點:數據佔用磁盤少

應用場景:

  1. 日誌系統;
  2. 大量的設備數據採集;

6.2.2 使用Archive存儲引擎建表語句

CREATE TABLE `users_archive` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=Archive

6.2.3 Archive對比InnoDB,使用函數批量存儲1w條數據

//批量添加函數:
CREATE DEFINER=`root`@`%` PROCEDURE `users_archive_batchAdd`()
begin
    declare i int;
    set i=1;
    while i<10000 do
				INSERT INTO users_archive(id,name,age,address) VALUES(i,concat('James',i),i,concat('BeiJing',i));
        set i=i+1;
     end while;
end

6.2.4 查看數據所在硬盤位置

  通過上文5.瞭解 MySQL 數據存儲方式,進入到存儲數據所在的硬盤下,便可以看到 users_archive 相關的表(.frm 爲表結構文件;.ARZ爲數據文件)
在這裏插入圖片描述

6.2.5 使用命令對比數據容量佔用情況

命令:du -s -h *
在這裏插入圖片描述

6.3 Memory存儲引擎

6.3.1 Memory介紹

  Memory存儲引擎(在以往的版本中,又叫 Heap 存儲引擎)。數據存儲在內存中,在實際的應用場景中用到的很少,但是它與優化器查詢有很大的關係,對臨時表很有用。(不瞭解優化器查詢??請點擊鏈接:aaaaaa瞭解)
 
  Memory中基於Hash索引,底層是 Hash 表,對於精確查詢非常高效。即:在’=’、'in’條件下高效,無法通過索引做區間查詢。只能掃描全表。(範圍查詢、排序、組合索引效率不高)
 
特點:

  1. 數據都是存儲在內存中,IO效率比其他引擎高很多;(優點:效率高)
  2. 服務重啓後數據會丟失,內存數據表默認只有16M(缺點:保證不了持久性)
  3. 支持 Hash索引,B Tree索引,默認爲 Hash索引
  4. 不支持大數據存儲類型,如 blog,text 等
  5. 表級鎖

應用場景:

  1. 等值查找熱度較高數據;
  2. 查詢結果在內存中進行計算,大多數都是採用這種存儲引擎作爲臨時表存儲需要計算的數據;

  工作中,使用內存管理這塊,我們根本不需要考慮 Memory 這種存儲引擎, Redis、Memcache 等它們不香嗎??Memory存儲引擎更多的使用在 MySQL 優化器查詢階段。下面簡單介紹一下:

  在優化器查詢階段,會以生成一個 template 臨時表的方式查詢。它的內存數據表默認只有 16M,並不支持大數據類型的存儲字段。在查詢階段,如果滿足 Memory 存儲引擎的所有條件,就會在優化器查詢階段使用 Memory 存儲引擎。如果不滿足條件,則會使用 MyISAM 引擎。

6.4 (重要)InnoDB存儲引擎

6.4.1 InnoDB介紹

  在 MySQL 5.5 及以後版本後,MySQL 選擇使用 InnoDB爲默認存儲引擎。在創建數據庫表時,不指定存儲引擎時,使用的就是 InnoDB。如需使用其他存儲引擎,可以手動來指定。
 
特點:

  1. InnoDB 支持事務操作;(每一條SQL都默認封裝成事務,自動提交,會影響速度)
  2. InnoDB 支持外鍵;
  3. InnoDB 是聚集索引(聚簇索引);
  4. InnoDB 不保存表的總條數;
  5. InnoDB 5.7版本之前不支持全文檢索;
  6. InnoDB 支持表級鎖、行級鎖,默認爲行級鎖
  7. InnoDB 表必須有主鍵(如果我們沒有明確去指定創建主鍵索引。它會幫我們隱藏的生成一個 6 byte 的 int 型的索引作爲主鍵索引);
  8. InnoDB 文件存儲方式爲.frm文件存儲表結構,ibd文件存儲數據內容。

名詞解釋:

  1. 什麼是聚集(簇)索引?
     
      MySQL 索引採用 B+Tree(不熟悉?來跳轉鏈接瞭解:MySQL 索引底層爲什麼選擇B+Tree)。InnoDB 和 MyISAM 作爲 MySQL 中 B+Tree 索引的兩種重要體現形式。
     
      InnoDB 推薦以主鍵作爲索引來組織數據進行存儲,它認爲主鍵是一個非常重要的屬性。InnoDB 表數據文件本身就是按B+Tree組織的一個索引結構,聚簇索引就是按照每張表的主鍵來構造一個B+樹,葉子節點中存放的就是整張表的數據。
     
      一般建表會用一個自增主鍵做聚簇索引,沒有的話MySQL會默認創建,但是這個主鍵如果更改代價較高,故建表時要考慮自增ID不能頻繁 update 這一點。
     
      (估計你還看不懂,哈哈。那就看看這裏你就懂了---->MySQL一張表,比如有id(主鍵),name,age等字段。我們可以建很多個索引,MySQL除了主鍵索引外,都是非聚簇索引。即只有我們創建的主鍵id索引,我們可以叫他id索引,它別名又叫做聚簇索引,理解成一個別名的即可。如果我們再創建一個name索引,它就叫做非聚簇索引。
     
      我們日常工作中,根據實際情況自行添加的索引都是輔助索引,輔助索引就是一個爲了需找主鍵索引的二級索引,現在找到主鍵索引再通過主鍵索引找數據;

  InnoDB 支持的一些特性,我們在此無法驗證,你只需要記住就好了。現在我們有一個db_store庫,庫中我們創建一個 employee 表,我們來看一下它在硬盤中的存儲情況。

6.4.2 使用InnoDB存儲引擎建表語句

CREATE TABLE `employee` (
  `employeeID` int(11) NOT NULL,
  `userName` varchar(16) COLLATE utf8_bin DEFAULT NULL,
  `phoneNum` varchar(32) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `createTime` datetime DEFAULT NULL,
  `lastUpdate` datetime DEFAULT NULL,
  PRIMARY KEY (`employeeID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;  -- 我們可以看出使用的 ENGINE=INNODB

6.4.3 瞭解 InnoDB 硬盤存儲方式

  通過上文5.瞭解 MySQL 數據存儲方式,進入/usr/local/mysql/data 目錄,再進入到 db_store 目錄下,我們便能夠很真實的看到數據庫中的數據在硬盤中存儲,它其實就是以兩個文件(employee.frm、employee.ibd)的方式體現。(此處可以看到有employee 和 store 兩個,說明 db_store 庫下有兩個表)
在這裏插入圖片描述

6.4.4 .frm 和 .ibd 格式文件介紹

.frm文件:保存的是表結構定義描述文件
.ibd文件:保存的是employee表中的數據內容
在這裏插入圖片描述

6.5 (重要)MyISAM存儲引擎

6.5.1 MyISAM介紹

MyISAM 作爲 MySQL 中 B+Tree 索引的另一種重要體現形式。
 
特點:

  1. MyISAM 是非聚集索引;
  2. MyISAM 有一個變量專門來保存整個表的行數,查詢count很快(注意不能加任何 where 條件)
  3. MyISAM 支持全文索引;
  4. MyISAM 可以被壓縮後進行查詢操作,節省空間容量;
  5. MyISAM 支持表級鎖,不支持行級鎖;
  6. MyISAM 中主鍵不是必須的;
  7. MyISAM 文件存儲方式爲.frm文件存儲表結構,myd文件存儲數據內容,myi文件存儲索引文件。

現在我們在db_store庫,庫中我們創建一個 employee_myisam 表,來看一下它在硬盤中的存儲情況。

6.5.2 使用MyISAM存儲引擎建表語句

CREATE TABLE `employee_myisam` (
  `employeeID` int(11) NOT NULL,
  `userName` varchar(16) COLLATE utf8_bin DEFAULT NULL,
  `phoneNum` varchar(32) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `createTime` datetime DEFAULT NULL,
  `lastUpdate` datetime DEFAULT NULL,
  PRIMARY KEY (`employeeID`)
) ENGINE=MyISAM CHARSET=utf8 COLLATE=utf8_bin;  -- 我們可以看出使用的 ENGINE=MyISAM

6.5.3 瞭解 MyIsam 硬盤存儲方式

  通過上文5.瞭解 MySQL 數據存儲方式,進入/usr/local/mysql/data 目錄,再進入到 db_store 目錄下,我們便能夠很真實的看到數據庫中的數據在硬盤中存儲,它其實就是以三個文件(xxx.frm、xxx.MYD、xxx.MYI)的方式體現。
在這裏插入圖片描述

6.5.4 .frm | .MYD | .MYI 格式文件介紹

.frm文件:保存的是表結構定義描述文件
.MYD文件:保存的是數據內容
.MYI文件:保存的是索引內容在這裏插入圖片描述

7. (重點)MyISAM 和 InnoDB 的區別(介紹特詳細哦)

  MyISAM 和 InnoDB 兩大存儲引擎的詳細區別介紹,請跳轉鏈接來了解:MyISAM 和 InnoDB 的區別


博主寫作不易,加個關注唄

求關注、求點贊,加個關注不迷路 ヾ(◍°∇°◍)ノ゙

博主不能保證寫的所有知識點都正確,但是能保證純手敲,錯誤也請指出,望輕噴 Thanks♪(・ω・)ノ

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