大家好,我是漫步coding, 最近在整理2022年MySQL最新面試題, 大家也可以通過(guò)我下面的博客地址在線閱讀, 今天講講第1篇: 數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)。 本文首發(fā)于公眾號(hào): 漫步coding

前言
最近整理一份關(guān)于MySQL常見(jiàn)面試題的,也會(huì)根據(jù)自己的經(jīng)驗(yàn), 標(biāo)注一些出現(xiàn)的概率,最高5顆★出現(xiàn)的概率最高。比如這樣:
百萬(wàn)級(jí)別或以上的數(shù)據(jù)如何刪除
出現(xiàn)概率: ★★★
一般來(lái)講在面試當(dāng)中, 關(guān)于數(shù)據(jù)庫(kù)相關(guān)的面試題頻率出現(xiàn)比較高的幾個(gè)關(guān)鍵詞是SQL優(yōu)化、索引、存儲(chǔ)引擎、事務(wù)、死鎖、樂(lè)觀鎖、悲觀鎖、關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)對(duì)比等等。把這幾個(gè)點(diǎn)問(wèn)完基本也差不多10~20分鐘了(一般一輪面試1小時(shí)左右), 基本這些可以讓面試官對(duì)你的數(shù)據(jù)庫(kù)知識(shí)有一定的了解了。
如果你線上運(yùn)維經(jīng)驗(yàn), 一般也會(huì)問(wèn)一些比如數(shù)據(jù)庫(kù)擴(kuò)容, 如何給大表加索引, 如何在業(yè)務(wù)高峰是給一個(gè)大表添加字段等。
0、概要
1、平時(shí)MySQL主要用哪個(gè)版本
2、數(shù)據(jù)庫(kù)三大范式是什么
3、MySQL有關(guān)權(quán)限的表都有哪幾個(gè)
4、MySQL的binlog有有幾種錄入格式?分別有什么區(qū)別?
5、平時(shí)用到哪些關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù), 可以談?wù)勀銓?duì)它們的理解嗎?
6、可以簡(jiǎn)單說(shuō)說(shuō)你對(duì)MySQL的邏輯架構(gòu)了解嗎?
7、了解MySQL中的MVCC是什么?
8、PostgreSQL相對(duì)于MySQL的優(yōu)勢(shì)
9、PostgreSQL和MySQL的一些區(qū)別
1、平時(shí)MySQL主要用哪個(gè)版本
出現(xiàn)概率: ★★★★
可以說(shuō)說(shuō)自己用的MySQL版本, 比如我自己用的版本是5.7版本,然后可以也簡(jiǎn)單聊聊這個(gè)版本的一些特點(diǎn):
1)、安全性
在MySQL 5.7中,有不少安全性相關(guān)的改進(jìn)。包括:
MySQL數(shù)據(jù)庫(kù)初始化完成以后,會(huì)產(chǎn)生一個(gè) root@localhost 用戶,從MySQL 5.7開(kāi)始,root用戶的密碼不再是空,而是隨機(jī)產(chǎn)生一個(gè)密碼,這也導(dǎo)致了用戶安裝5.7時(shí)發(fā)現(xiàn)的與5.6版本比較大的一個(gè)不同點(diǎn)。
MySQL官方已經(jīng)刪除了test數(shù)據(jù)庫(kù),默認(rèn)安裝完后是沒(méi)有test數(shù)據(jù)庫(kù)的,就算用戶創(chuàng)建了test庫(kù),也可以對(duì)test庫(kù)進(jìn)行權(quán)限控制了
MySQL 5.7版本提供了更為簡(jiǎn)單SSL安全訪問(wèn)配置,并且默認(rèn)連接就采用SSL的加密方式。
可以為用戶設(shè)置密碼過(guò)期策略,一定時(shí)間以后,強(qiáng)制用戶修改密碼。
2)、靈活性
MySQL 5.7的兩個(gè)全新的功能,即JSON和generate column
CREATE TABLE t1 (jdoc JSON);INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
3)、可用性
在線設(shè)置復(fù)制的過(guò)濾規(guī)則,不再需要重啟MySQL,只需要停止SQL thread,修改完成以后,啟動(dòng)SQL thread
這個(gè)主要大致談?wù)勀阕约旱睦斫猓?也可以根據(jù)自己的理解多延展一些, 提高面試的加分。
2、數(shù)據(jù)庫(kù)三大范式是什么
出現(xiàn)概率: ★★★
第一范式:每個(gè)列都不可以再拆分。
第二范式:在第一范式的基礎(chǔ)上,非主鍵列完全依賴于主鍵,而不能是依賴于主鍵的一部分。
第三范式:在第二范式的基礎(chǔ)上,非主鍵列只依賴于主鍵,不依賴于其他非主鍵。
在設(shè)計(jì)數(shù)據(jù)庫(kù)結(jié)構(gòu)的時(shí)候,要盡量遵守三范式,如果不遵守,必須有足夠的理由。比如性能。事實(shí)上我們經(jīng)常會(huì)為了性能而妥協(xié)數(shù)據(jù)庫(kù)的設(shè)計(jì)。
3、MySQL有關(guān)權(quán)限的表都有哪幾個(gè)
出現(xiàn)概率: ★★★
MySQL服務(wù)器通過(guò)權(quán)限表來(lái)控制用戶對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),權(quán)限表存放在mysql數(shù)據(jù)庫(kù)里,由mysql_install_db腳本初始化。這些權(quán)限表分別user,db,table_priv,columns_priv和host。下面分別介紹一下這些表的結(jié)構(gòu)和內(nèi)容:
user權(quán)限表:記錄允許連接到服務(wù)器的用戶帳號(hào)信息,里面的權(quán)限是全局級(jí)的。
db權(quán)限表:記錄各個(gè)帳號(hào)在各個(gè)數(shù)據(jù)庫(kù)上的操作權(quán)限。
table_priv權(quán)限表:記錄數(shù)據(jù)表級(jí)的操作權(quán)限。
columns_priv權(quán)限表:記錄數(shù)據(jù)列級(jí)的操作權(quán)限。
host權(quán)限表:配合db權(quán)限表對(duì)給定主機(jī)上數(shù)據(jù)庫(kù)級(jí)操作權(quán)限作更細(xì)致的控制。這個(gè)權(quán)限表不受GRANT和REVOKE語(yǔ)句的影響。
4、MySQL的binlog有有幾種錄入格式?分別有什么區(qū)別?
出現(xiàn)概率: ★★★
MySQL的binlog有三種格式: statement,row和mixed。
1)、statement模式下,每一條會(huì)修改數(shù)據(jù)的sql都會(huì)記錄在binlog中。不需要記錄每一行的變化,減少了binlog日志量,節(jié)約了IO,提高性能。由于sql的執(zhí)行是有上下文的,因此在保存的時(shí)候需要保存相關(guān)的信息,同時(shí)還有一些使用了函數(shù)之類的語(yǔ)句無(wú)法被記錄復(fù)制。
2)、row級(jí)別下,不記錄sql語(yǔ)句上下文相關(guān)信息,僅保存哪條記錄被修改。記錄單元為每一行的改動(dòng),基本是可以全部記下來(lái)但是由于很多操作,會(huì)導(dǎo)致大量行的改動(dòng)(比如alter table),因此這種模式的文件保存的信息太多,日志量太大。
3)、mixed,一種折中的方案,普通操作使用statement記錄,當(dāng)無(wú)法使用statement的時(shí)候使用row。
此外,新版的MySQL中對(duì)row級(jí)別也做了一些優(yōu)化,當(dāng)表結(jié)構(gòu)發(fā)生變化的時(shí)候,會(huì)記錄語(yǔ)句而不是逐行記錄。
平時(shí)用到哪些關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù), 可以談?wù)勀銓?duì)它們的理解嗎?
出現(xiàn)概率: ★★★★★
主要講講你用過(guò)的關(guān)系型數(shù)據(jù)庫(kù)比如MySQL, 非關(guān)系數(shù)據(jù)庫(kù)(NoSql數(shù)據(jù)庫(kù))比如Redis, MongoDB等等。
1)、事務(wù)方面
關(guān)系型數(shù)據(jù)庫(kù)的最大特點(diǎn)就是事務(wù)的一致性, 所以對(duì)于訂單模型 對(duì)一致性要求比較高的還是建議用MySQL。
2)、關(guān)系數(shù)據(jù)庫(kù)的另一個(gè)特點(diǎn)就是其具有固定的表結(jié)構(gòu)
其實(shí)在業(yè)務(wù)模型中, 表結(jié)構(gòu)固定反而是一件好事, 沒(méi)有約束的模型 更容易出問(wèn)題。
3)、復(fù)雜SQL,特別是多表關(guān)聯(lián)查詢
NoSql是不支持JOIN 這種查詢的。
4)、索引方式
關(guān)系型數(shù)據(jù)庫(kù):B樹(shù)、哈希等
NoSql:鍵值索引
5)、并發(fā)支持
關(guān)系型數(shù)據(jù)庫(kù):通過(guò)事務(wù)和鎖來(lái)支持并發(fā),高并發(fā)情況下,執(zhí)行效率較低。
NoSql:打破了傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)范式的約束和事務(wù)一致性,因此并發(fā)性能高。
當(dāng)然自己也可以多延伸看一下, 畢竟這個(gè)面試出現(xiàn)的概率還是蠻高的。

5、可以簡(jiǎn)單說(shuō)說(shuō)你對(duì)MySQL的邏輯架構(gòu)了解嗎?
出現(xiàn)概率: ★★★
第一層是服務(wù)器層,主要提供連接處理、授權(quán)認(rèn)證、安全等功能。
第二層實(shí)現(xiàn)了 MySQL 核心服務(wù)功能,包括查詢解析、分析、優(yōu)化、緩存以及日期和時(shí)間等所有內(nèi)置函數(shù),所有跨存儲(chǔ)引擎的功能都在這一層實(shí)現(xiàn),例如存儲(chǔ)過(guò)程、觸發(fā)器、視圖等。
第三層是存儲(chǔ)引擎層,存儲(chǔ)引擎負(fù)責(zé) MySQL 中數(shù)據(jù)的存儲(chǔ)和提取。服務(wù)器通過(guò) API 與存儲(chǔ)引擎通信,這些接口屏蔽了不同存儲(chǔ)引擎的差異,使得差異對(duì)上層查詢過(guò)程透明。除了會(huì)解析外鍵定義的 InnoDB 外,存儲(chǔ)引擎不會(huì)解析 SQL,不同存儲(chǔ)引擎之間也不會(huì)相互通信,只是簡(jiǎn)單響應(yīng)上層服務(wù)器請(qǐng)求。
6、了解MySQL中的MVCC是什么?
出現(xiàn)概率: ★★★
MVCC 是多版本并發(fā)控制,在很多情況下避免加鎖,大都實(shí)現(xiàn)了非阻塞的讀操作,寫操作也只鎖定必要的行。
InnoDB 的MVCC 通過(guò)在每行記錄后面保存兩個(gè)隱藏的列來(lái)實(shí)現(xiàn),這兩個(gè)列一個(gè)保存了行的創(chuàng)建時(shí)間,一個(gè)保存行的過(guò)期時(shí)間間。不過(guò)存儲(chǔ)的不是實(shí)際的時(shí)間值而是系統(tǒng)版本號(hào),每開(kāi)始一個(gè)新的事務(wù)系統(tǒng)版本號(hào)都會(huì)自動(dòng)遞增,事務(wù)開(kāi)始時(shí)刻的系統(tǒng)版本號(hào)會(huì)作為事務(wù)的版本號(hào),用來(lái)和查詢到的每行記錄的版本號(hào)進(jìn)行比較。
MVCC 只能在 READ COMMITTED 和 REPEATABLE READ 兩個(gè)隔離級(jí)別下工作,因?yàn)?READ UNCOMMITTED 總是讀取最新的數(shù)據(jù)行,而不是符合當(dāng)前事務(wù)版本的數(shù)據(jù)行,而 SERIALIZABLE 則會(huì)對(duì)所有讀取的行都加鎖。
7、PostgreSQL相對(duì)于MySQL的優(yōu)勢(shì)
出現(xiàn)概率: ★★★★
在SQL的標(biāo)準(zhǔn)實(shí)現(xiàn)上要比MySQL完善,而且功能實(shí)現(xiàn)比較嚴(yán)謹(jǐn);
存儲(chǔ)過(guò)程的功能支持要比MySQL好,具備本地緩存執(zhí)行計(jì)劃的能力;
對(duì)表連接支持較完整,優(yōu)化器的功能較完整,支持的索引類型很多,復(fù)雜查詢能力較強(qiáng);
PG主表采用堆表存放,MySQL采用索引組織表,能夠支持比MySQL更大的數(shù)據(jù)量。
PG的主備復(fù)制屬于物理復(fù)制,相對(duì)于MySQL基于binlog的邏輯復(fù)制,數(shù)據(jù)的一致性更加可靠,復(fù)制性能更高,對(duì)主機(jī)性能的影響也更小。
8、PostgreSQL和MySQL的一些區(qū)別
出現(xiàn)概率: ★★★★
這個(gè)其實(shí)出現(xiàn)的概率還比較高, 自己可以說(shuō)幾點(diǎn)就行了
MySQL不支持地理數(shù)據(jù)類型。
從9.2開(kāi)始,PG支持json數(shù)據(jù)類型。相對(duì)于MySQL來(lái)說(shuō),PG對(duì)json的支持比較先進(jìn)。他有一些json指定的操作符和函數(shù),是的搜索json文本非常高效。9.4開(kāi)始,可以以二進(jìn)制的格式存儲(chǔ)json數(shù)據(jù),支持在該列上進(jìn)行全文索引(GIN索引),從而在json文檔中進(jìn)行快速搜索。
從5.7開(kāi)始,MySQL支持json數(shù)據(jù)類型,比PG晚。也可以在json列上建立索引。然而對(duì)json相關(guān)的函數(shù)的支持比較有限。不支持在json列上全文索引。由于MySQL對(duì)SQL支持的限制,在存儲(chǔ)和處理json數(shù)據(jù)方面,MySQL不是一個(gè)很好的選擇。