亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

面試官問我Mysql的存儲引擎了解多少

 更新時間:2022年08月03日 10:28:33   作者:怪?咖@  
mysql面試中最常問的問題之一:小伙子,你說一下你們公司用的存儲引擎,以及你知道有哪些存儲引擎和他們之間的區(qū)別? 所以下面這篇文章主要給大家介紹了關(guān)于Mysql存儲引擎的相關(guān)資料,需要的朋友可以參考下

文章部分來源于黑馬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在字段前/后增加字符串

    淺談mysql中concat函數(shù),mysql在字段前/后增加字符串

    下面小編就為大家?guī)硪黄獪\談mysql中concat函數(shù),mysql在字段前/后增加字符串。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • MySQL復(fù)合查詢的實現(xiàn)示例

    MySQL復(fù)合查詢的實現(xiàn)示例

    復(fù)合查詢語句是MySQL中一種非常重要的查詢方式,可以用于優(yōu)化查詢性能和控制查詢的結(jié)果集,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • MySQL間隙鎖解決幻讀問題

    MySQL間隙鎖解決幻讀問題

    本文主要介紹了MySQL間隙鎖解決幻讀問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • MySQL窗口函數(shù) over(partition by)的用法

    MySQL窗口函數(shù) over(partition by)的用法

    本文主要介紹了MySQL窗口函數(shù) over(partition by)的用法, partition by相比較于group by,能夠在保留全部數(shù)據(jù)的基礎(chǔ)上,只對其中某些字段做分組排序,下面就來介紹一下具體用法,感興趣的可以了解一下
    2024-02-02
  • MySQL比較運算符使用詳解及注意事項

    MySQL比較運算符使用詳解及注意事項

    這篇文章主要給大家介紹了關(guān)于MySQL比較運算符使用詳解及注意事項的相關(guān)資料,Mysql可以通過運算符來對表中數(shù)據(jù)進行運算,比如通過出生日期求年齡等,需要的朋友可以參考下
    2024-01-01
  • Mysql 字符集不一致導(dǎo)致連表異常的解決

    Mysql 字符集不一致導(dǎo)致連表異常的解決

    做一個簡單的如下的連表查詢,居然直接提示錯誤,居然是字符集不一致的問題,本文記錄一下mysql的字符集類型,感興趣的可以了解一下
    2021-09-09
  • Mysql數(shù)據(jù)庫介紹及mysql顯示命令

    Mysql數(shù)據(jù)庫介紹及mysql顯示命令

    這篇文章主要介紹了Mysql數(shù)據(jù)庫介紹及mysql顯示命令 的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • Mysql5.7忘記root密碼及mysql5.7修改root密碼的方法

    Mysql5.7忘記root密碼及mysql5.7修改root密碼的方法

    這篇文章主要介紹了Mysql5.7忘記root密碼及mysql5.7修改root密碼的方法的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • mysql SELECT語句去除某個字段的重復(fù)信息

    mysql SELECT語句去除某個字段的重復(fù)信息

    mysql SELECT語句去除某個字段的重復(fù)信息,需要的朋友可以收藏下。
    2010-04-04
  • MySQL學(xué)習(xí)之事務(wù)詳解

    MySQL學(xué)習(xí)之事務(wù)詳解

    在數(shù)據(jù)庫中?事務(wù)(transaction)?可以把多個SQL給打包到一起,?即將多個SQL語句變成一個整體,?也就是說一個事務(wù)中的所有操作要么全部成功執(zhí)行,?要么完全不執(zhí)行.本文主要來和大家聊聊事務(wù)的使用,需要的可以參考一下
    2022-12-12

最新評論