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