面試官問我Mysql的存儲引擎了解多少
文章部分來源于黑馬Mysql視頻教程當中!
一、MySQL體系結(jié)構(gòu)
如下圖,Mysql總共分為了四層:
- 連接層: 最上層是一些客戶端和鏈接服務(wù),主要完成一些類似于連接處理、授權(quán)認證、及相關(guān)的安全方案。服務(wù)器也會為安全接入的每個客戶端驗證它所具有的操作權(quán)限。
- 服務(wù)層: 第二層架構(gòu)主要完成大多數(shù)的核心服務(wù)功能,如SQL接口,并完成緩存的查詢,SQL的分析和優(yōu)化,部分內(nèi)置函數(shù)的執(zhí)行。所有跨存儲引擎的功能也在這一層實現(xiàn),如過程、函數(shù)等。
- 引擎層: 存儲引擎真正的負責了MySQL中數(shù)據(jù)的存儲和提取,服務(wù)器通過API和存儲引擎進行通信。不同的存儲引擎具有不同的功能,這樣我們可以根據(jù)自己的需要,來選取合適的存儲引擎。
- 存儲層: 主要是將數(shù)據(jù)存儲在文件系統(tǒng)之上,并完成與存儲引擎的交互。
二、存儲引擎簡介
引擎就是發(fā)動機,引擎就是一個機器的核心部分,不同的引擎有著不同的應(yīng)用場景,例如飛機有飛機的引擎,火箭有火箭的引擎,他們之間是沒有好壞之分的,我們只需要在合適的場景使用合適的引擎就可以了。
Mysql 存儲引擎就是存儲數(shù)據(jù)、建立索引、更新/查詢數(shù)據(jù)等技術(shù)的實現(xiàn)方式。存儲引擎是基于表的,而不是基于庫的,所以存儲引擎也可被稱為表類型。
三、存儲引擎的使用
(1)創(chuàng)建表的時候可以 通過ENGINE來指定存儲引擎:
(2)查看當前數(shù)據(jù)庫支持的存儲引擎:
創(chuàng)建表的時候假如不指定引擎,默認就是InnoDB,在mysql早期的時候默認存儲引擎是MyISAM。其中comment列就是官方對當前存儲引擎的特性描述!
(3)查看某張表使用的存儲引擎
如下sql可以查看當前表結(jié)構(gòu):
show create table 表名;
ENGINE
:代表的是當前表的存儲引擎AUTO_INCREMENT
:代表的是自增id目前已經(jīng)增到多少了CHARESET
:代表的是字符集COLLATE
:代表的是排序規(guī)則
四、存儲引擎特點
這里重點解釋三個存儲引擎,同時也是面試當中經(jīng)常會問的!
1、InnoDB
InnoDB是一種兼顧高可靠性和高性能的通用存儲引擎,在MySQL5.5之后,InnoDB是默認的MySQL存儲引擎。
(1)特點:
- DML操作遵循ACID模型,支持事務(wù);
- 行級鎖,提高并發(fā)訪問性能;
- 支持外鍵FOREIGN KEY約束,保證數(shù)據(jù)的完整性和正確性
(2)不管是哪個引擎,數(shù)據(jù)肯定都是存儲在硬盤的,我們可以通過以下命令查看存儲位置:
SHOW VARIABLES LIKE 'datadir';
根據(jù)查詢的位置打開,然后會發(fā)現(xiàn)每個數(shù)據(jù)庫就是一個文件夾
然后任意打開一個庫進去會發(fā)現(xiàn)都是frm文件!
frm文件是用來保存每個數(shù)據(jù)表的元數(shù)據(jù)信息,包括表結(jié)構(gòu)的定義等。根本沒有找到對應(yīng)的數(shù)據(jù)文件,這是為什么呢,繼續(xù)往下看!
(3)存儲文件:
正常innodb引擎存儲表的時候會有兩個文件,一個是frm文件,一個是ibd文件。
Xxx.ibd: xxx代表的是表名, innoDB引擎的每張表都會對應(yīng)這樣一個表空間文件,存儲該表的數(shù)據(jù)和索引。
可是我們在上面并沒有看到ibd文件,這是因為mysql將存儲方式分為了兩種:
共享表空間:所謂共享表空間,就是所有數(shù)據(jù)庫的表數(shù)據(jù)都存在了一個地方獨立表空間:每個表都對應(yīng)了一個ibd文件,存儲數(shù)據(jù)
可以通過innodb_file_per_table參數(shù)來開啟獨立表空間,mysql8.0默認是打開了獨立表空間,其余貌似默認都是關(guān)閉的。
innodb_file_per_table 的簡要說明:
在很久很久以前也就是說還沒有innodb_file_per_table 的那個年代,所有的innodb表的數(shù)據(jù)都是保存在共享表空間,在有了innodb_file_per_table參數(shù)后innodb可以把每個表的數(shù)據(jù)單獨保存。單獨保存有兩方面的優(yōu)勢一個是方便管理,二個是提長性能。
show global variables like 'innodb_file_per_table'; -- 查看 set @@global.innodb_file_per_table=off; -- 關(guān)閉 set @@global.innodb_file_per_table=on; -- 打開innodb_file_per_table
innodb_file_per_table參數(shù),mysql8.0默認是打開的,如果打開就代表的是每一張表對應(yīng)了一個表空間。我的mysql是5.5版本的,所以根本沒有開啟,沒有開啟著意味著所有數(shù)據(jù)共用了一個表空間(也可以稱為數(shù)據(jù)文件)。
(4)共享表空間文件上哪找?
默認配置下有一個初識大小為10M,名為ibdata1的文件,默認的表空間文件(tablespace file)。通過參數(shù)innodb_data_file_path可以設(shè)置文件
show global variables like 'innodb_data_file_path'; #查看表空間文件設(shè)置
解釋ibdata1:10M:autpextend
:代表的是表空間文件名為ibdata1,然后初始大小為10M,文件可以自動增長(autoextend)。
(5)通過以上命令我們知道表空間文件名稱為ibdata1,那么他存儲在什么地方?
他存儲在我們安裝mysql的時候指定的安裝目錄下,如果忘記安裝目錄了,可以通過全局搜文件名稱,來尋找文件!
整個mysql所有庫的數(shù)據(jù)都存放在下面文件當中!
(6)可以修改共享表空間設(shè)置:
表示將/db/ibdata1和/dr2/db/ibdata2兩個文件來組成表空間,其中ibadata1的大小為2000M,文件ibdata2的大小為2000MB,如果用完了這2000MB,該文件可以自動增長(autoextend)。
innodb_data_file_path=/db/ibdata1:2000M;/dr2/db/ibdata2:2000M:autoextend
(7)將innodb_file_per_table打開
set @@global.innodb_file_per_table=on; -- 打開
打開后他不會將歷史的表已經(jīng)共享的給單獨獨立起來,而是指的以后在新建表的時候,那么新建的表就是單獨的表空間。
打開后新建了一個test表:
通過MySQL的 ibd2sdi
工具可以解析ibd文件,可以解析成json數(shù)據(jù)。
(8)innodb存儲結(jié)構(gòu):
說是innodb存儲結(jié)構(gòu),不如說是ibd文件的存儲結(jié)構(gòu)!
- 一個表空間可以包含多個段
- 一個段當中又可以包含多個區(qū)
- 一個區(qū)當中包含多個頁,頁包含了索引頁和數(shù)據(jù)頁,一個區(qū)固定的是1M,一個page頁大小是16k,一個區(qū)當中可以包含64個頁
- 一個頁當中又包含了多個行,一個row行當中包含了最后一次事務(wù)id、指針、最后就是一個一個的字段了
page頁是innodb存儲結(jié)構(gòu)當中最小的單元
具體了解存儲結(jié)構(gòu)的話內(nèi)容有很多,后續(xù)寫一篇專門分析存儲結(jié)構(gòu)的文章!
2、MyISAM
MyISAM是MySQL早期的默認存儲引擎。這也就是經(jīng)常面試問Innodb和MyISAM區(qū)別的原因!
(1)特點:
- 不支持事務(wù)
- 不支持外鍵
- 支持表鎖,不支持行鎖訪問速度快
(2)存儲文件:
一個表對應(yīng)了三個文件,而innodb對應(yīng)了兩個文件!
3、MEMORY
MEMORY引擎的表數(shù)據(jù)是存儲在內(nèi)存中的,由于受到硬件問題、或斷電問題的影響,只能將這些表作為臨時表或緩存使用。
(1)特點:
- 內(nèi)存存放
- hash索引(默認)
(2)存儲文件:
xxx.sdi:存儲表結(jié)構(gòu)信息
五、存儲引擎選擇
在選擇存儲引擎時,應(yīng)該根據(jù)應(yīng)用系統(tǒng)的特點選擇合適的存儲引擎。對于復(fù)雜的應(yīng)用系統(tǒng),還可以根據(jù)實際情況選擇多種存儲引擎進行組合。
- InnoDB:是Mysql的默認存儲引擎,支持事務(wù)、外鍵。如果應(yīng)用對事務(wù)的完整性有比較高的要求,在并發(fā)條件下要求數(shù)據(jù)的一致性,數(shù)據(jù)操作除了插入和查詢之外,還包含很多的更新、刪除操作,那么InnoDB存儲引擎是比較合適的選擇。
- MyISAM:如果應(yīng)用是以讀操作和插入操作為主,只有很少的更新和刪除操作,并且對事務(wù)的完整性、并發(fā)性要求不是很高,那么選擇這個存儲引攀是非常合適的。
- MEMORY:將所有數(shù)據(jù)保存在內(nèi)存中,訪問速度快,通常用于臨時表及緩存。MEMORY的缺陷就是對表的大小有限制,太大的表無法緩存在內(nèi)存中,而且無法保障數(shù)據(jù)的安全性。
在問你InnoDB和MyISAM的區(qū)別的時候,只需要圍繞這三點來回答:事務(wù)、外鍵、行級鎖
總結(jié)
到此這篇關(guān)于對存儲引擎了解多少的文章就介紹到這了,更多相關(guān)Mysql存儲引擎內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談mysql中concat函數(shù),mysql在字段前/后增加字符串
下面小編就為大家?guī)硪黄獪\談mysql中concat函數(shù),mysql在字段前/后增加字符串。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02MySQL窗口函數(shù) over(partition by)的用法
本文主要介紹了MySQL窗口函數(shù) over(partition by)的用法, partition by相比較于group by,能夠在保留全部數(shù)據(jù)的基礎(chǔ)上,只對其中某些字段做分組排序,下面就來介紹一下具體用法,感興趣的可以了解一下2024-02-02Mysql5.7忘記root密碼及mysql5.7修改root密碼的方法
這篇文章主要介紹了Mysql5.7忘記root密碼及mysql5.7修改root密碼的方法的相關(guān)資料,需要的朋友可以參考下2016-01-01