本文目錄:
1.MySQL體系結構
開篇先來一張MySQL體系圖,讓你來了解一下存儲引擎所在的位置。
如果你對 MySQL 體系結構還不是很熟悉,你可以查看圖片中的備註信息。你也可以跳轉到:瞭解MySQL體系結構 來具體瞭解專業名詞的介紹。
2.存儲引擎介紹
關係型數據庫,就是用來存儲各種數據信息的。根據不同業務場景,比如說:有的表簡單,有的表複雜,有的表根本不用來存儲任何長期的數據,有的表需要查詢非常快
。在我們實際的業務開發中,可能需要用到各種各樣的表,不同的表也意味着存儲不同類型的數據,數據的處理上也就會存在着差異。針對 MySQL 來說,它提供了很多類型的存儲引擎來供我們選擇,我們可以數據業務需求來選擇不同的存儲引擎,最大程度的發揮 MySQL 的強大之處。
3.MySQL 存儲引擎特性
- 採用的是
插拔式
的插件方式; - 存儲引擎是指定在表之上的,即
一個庫中的每一個表都可以指定選擇存儲引擎
; - 不管表採用什麼樣的存儲引擎,都會在數據區,產生對應的一個
.frm
文件(表結構定義描述文件,下文有介紹)
4.MySQL 有哪些存儲引擎
我們可以使用命令:show engines;
來查看 MySQL 支持哪些存儲引擎,如下圖所示。我們可以看到 MySQL 默認使用的存儲引擎是 InnoDB
(下圖 MySQL 使用的版本爲5.7.28)。
注意:在MySQL 5.5之前默認的存儲引擎是 MyISAM,5.5版本及以後默認存儲引擎修改爲 InnoDB,具體5.5.x 哪個小版本號不清楚,討論這也沒什麼意義)。
在工作中,經常用到的還是InnoDB
和MyISAM
這兩種,其他存儲引擎在指定一些場景下會更加的高效。接下來就從幾個方面來對InnoDB
、MyISAM
、CSV
、Archive
、Memory
這五種存儲引擎做一個基本的瞭解。
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文件
存儲。
特點:
- 不能定義索引,列定義必須爲NOT NULL,不能設置自增列;
(缺點:不適用於大表或者數據查詢、排序等處理操作)
- CSV數據的存儲需要用
,
逗號隔開,可直接編輯 CSV文件進行數據的編排(缺點:數據安全性低)
- 可以對硬盤中保存的表文件數據進行直接編輯xxx.CSV文件,但是不能將該文件刪除然後上傳自己的同名.CSV文件(該文件中可能還有額外一些和表相關的數據),我們只能對其中數據進行編輯操作。編輯之後,通過命令:
flush table XXX表名
的方式使其生效應用場景:
- 數據的快速導入導出;
- 表格直接轉換成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存儲引擎,是以
壓縮協議
進行數據的存儲
特點:
- 只支持 insert 和 select 兩種操作;
(缺點:不適用於對數據的處理操作)
- 只允許自增ID列建立索引
(缺點:還是不方便數據的處理)
- 支持行級鎖
- 不支持事務
- 優點:數據佔用磁盤少
應用場景:
- 日誌系統;
- 大量的設備數據採集;
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’條件下高效,無法通過索引做區間查詢。只能掃描全表。(範圍查詢、排序、組合索引效率不高)
特點:
- 數據都是存儲在內存中,IO效率比其他引擎高很多;
(優點:效率高)
- 服務重啓後數據會丟失,內存數據表默認只有16M
(缺點:保證不了持久性)
- 支持 Hash索引,B Tree索引,
默認爲 Hash索引
- 不支持大數據存儲類型,如 blog,text 等
- 表級鎖
應用場景:
- 等值查找熱度較高數據;
- 查詢結果在內存中進行計算,大多數都是採用這種存儲引擎作爲臨時表存儲需要計算的數據;
工作中,使用內存管理這塊,我們根本不需要考慮 Memory 這種存儲引擎, Redis、Memcache 等它們不香嗎??
Memory存儲引擎更多的使用在 MySQL 優化器查詢階段。下面簡單介紹一下:
在優化器查詢階段,會以生成一個 template 臨時表的方式查詢。它的內存數據表默認只有 16M,並不支持大數據類型的存儲字段。在查詢階段,如果滿足 Memory 存儲引擎的所有條件,就會在優化器查詢階段使用 Memory 存儲引擎。如果不滿足條件,則會使用 MyISAM 引擎。
6.4 (重要)InnoDB存儲引擎
6.4.1 InnoDB介紹
在 MySQL 5.5 及以後版本後,MySQL 選擇使用 InnoDB爲默認存儲引擎。在創建數據庫表時,不指定存儲引擎時,使用的就是 InnoDB。如需使用其他存儲引擎,可以手動來指定。
特點:
- InnoDB 支持事務操作;(每一條SQL都默認封裝成事務,自動提交,會影響速度)
- InnoDB 支持外鍵;
- InnoDB 是聚集索引(聚簇索引);
- InnoDB 不保存表的總條數;
- InnoDB 5.7版本之前不支持全文檢索;
- InnoDB 支持表級鎖、行級鎖,
默認爲行級鎖
;- InnoDB 表必須有主鍵(如果我們沒有明確去指定創建主鍵索引。它會幫我們隱藏的生成一個 6 byte 的 int 型的索引作爲主鍵索引);
- InnoDB 文件存儲方式爲
.frm文件
存儲表結構,ibd文件
存儲數據內容。名詞解釋:
- 什麼是聚集(簇)索引?
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 索引的另一種重要體現形式。
特點:
- MyISAM 是非聚集索引;
- MyISAM 有一個變量專門來保存整個表的行數,查詢count很快(注意不能加任何 where 條件)
- MyISAM 支持全文索引;
- MyISAM 可以被壓縮後進行查詢操作,節省空間容量;
- MyISAM 支持表級鎖,不支持行級鎖;
- MyISAM 中主鍵不是必須的;
- 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♪(・ω・)ノ