《2020全新面試題題庫》9月(數(shù)據(jù)庫部分)
此前我們整理了一系列筆試面試題,受到大家的廣泛認(rèn)可和支持,聽說有小伙伴通過刷題(當(dāng)然他本來也很厲害)成功拿到了心儀已久的Offer!為了幫助更多有需求的小伙伴,在此“金九銀十”之際,我們花費(fèi)了更多心血,整理了《2020全新面試題題庫》9月新鮮出爐,今天給大家分享分享?。〝?shù)據(jù)庫部分)
?
內(nèi)容概述
數(shù)據(jù)庫面試筆試全套內(nèi)容,包含從基礎(chǔ)知識到高級數(shù)據(jù)庫編程;數(shù)據(jù)庫DBA級的調(diào)優(yōu)策略;案例分析,等不同階段的考察試題。
?
本題庫共包含7大部分,前后整理校對成冊,共36頁
1 基礎(chǔ)部分:數(shù)據(jù)庫應(yīng)用的基礎(chǔ)知識,描述數(shù)據(jù)的表,視圖,存儲過程,關(guān)系,數(shù)據(jù)庫操作等
2 索引:多種索引的應(yīng)用和特點(diǎn),索引使用案例
3 事務(wù):從基礎(chǔ)概念到事務(wù)四大特征,事務(wù)并發(fā)特征,隔離級別…….多方面深度剖析
4 存儲引擎:就MySql數(shù)據(jù)庫的多種數(shù)據(jù)庫引擎特點(diǎn)詳解
5 優(yōu)化:包含對數(shù)據(jù)庫Sql語句的優(yōu)化,優(yōu)化分析,MySQL 慢查詢優(yōu)化;
6 數(shù)據(jù)庫鎖:介紹MySql數(shù)據(jù)鎖的種類,死鎖,死鎖的原因,死鎖的解決方案,配置鎖的超時(shí),樂觀鎖,悲觀鎖,不同鎖的具體應(yīng)用
7 其他:除了上述問題 針對數(shù)據(jù)庫主從復(fù)制.和數(shù)據(jù)庫主從復(fù)制的缺陷本題庫亦做了詳細(xì)解讀
?
以上就是本題庫的全部內(nèi)容,整理不易,希望能對大家有所幫助!下面開始第一部分!
一、基本概念?????????????????????????????????????????
1.主鍵、外鍵、超鍵、候選鍵
超鍵:
在關(guān)系中能唯一標(biāo)識元組的屬性集稱為關(guān)系模式的超鍵。一個(gè)屬性可以為作為一個(gè)超鍵,多個(gè)屬性組合在一起也可以作為一個(gè)超鍵。超鍵包含候選鍵和主鍵。
候選鍵:
是最小超鍵,即沒有冗余元素的超鍵。
主鍵:
數(shù)據(jù)庫表中對儲存數(shù)據(jù)對象予以唯一和完整標(biāo)識的數(shù)據(jù)列或?qū)傩缘慕M合。一個(gè)數(shù)據(jù)列只能有一個(gè)主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。
外鍵:
在一個(gè)表中存在的另一個(gè)表的主鍵稱此表的外鍵。
2.為什么用自增列作為主鍵
如果我們定義了主鍵(PRIMARY KEY),那么InnoDB會選擇主鍵作為聚集索引、
?
?
如果沒有顯式定義主鍵,則InnoDB會選擇第一個(gè)不包含有NULL值的唯一索引作為主鍵索引、
如果也沒有這樣的唯一索引,則InnoDB會選擇內(nèi)置6字節(jié)長的ROWID作為隱含的聚集索引(ROWID隨著行記錄的寫入而主鍵遞增,這個(gè)ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。
?
數(shù)據(jù)記錄本身被存于主索引(一顆B+Tree)的葉子節(jié)點(diǎn)上。這就要求同一個(gè)葉子節(jié)點(diǎn)內(nèi)(大小為一個(gè)內(nèi)存頁或磁盤頁)的各條數(shù)據(jù)記錄按主鍵順序存放,因此每當(dāng)有一條新的記錄插入時(shí),MySQL會根據(jù)其主鍵將其插入適當(dāng)?shù)墓?jié)點(diǎn)和位置,如果頁面達(dá)到裝載因子(InnoDB默認(rèn)為15/16),則開辟一個(gè)新的頁(節(jié)點(diǎn))
如果表使用自增主鍵,那么每次插入新的記錄,記錄就會順序添加到當(dāng)前索引節(jié)點(diǎn)的后續(xù)位置,當(dāng)一頁寫滿,就會自動(dòng)開辟一個(gè)新的頁
如果使用非自增主鍵(如果身份證號或?qū)W號等),由于每次插入主鍵的值近似于隨機(jī),因此每次新記錄都要被插到現(xiàn)有索引頁的中間某個(gè)位置,此時(shí)MySQL不得不為了將新記錄插到合適位置而移動(dòng)數(shù)據(jù),甚至目標(biāo)頁面可能已經(jīng)被回寫到磁盤上而從緩存中清掉,此時(shí)又要從磁盤上讀回來,這增加了很多開銷,同時(shí)頻繁的移動(dòng)、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結(jié)構(gòu),后續(xù)不得不通過OPTIMIZE TABLE來重建表并優(yōu)化填充頁面。
3.觸發(fā)器的作用?
觸發(fā)器是一種特殊的存儲過程,主要是通過事件來觸發(fā)而被執(zhí)行的。它可以強(qiáng)化約束,來維護(hù)數(shù)據(jù)的完整性和一致性,可以跟蹤數(shù)據(jù)庫內(nèi)的操作從而不允許未經(jīng)許可的更新和變化??梢月?lián)級運(yùn)算。如,某表上的觸發(fā)器上包含對另一個(gè)表的數(shù)據(jù)操作,而該操作又會導(dǎo)致該表觸發(fā)器被觸發(fā)。
4.什么是存儲過程?用什么來調(diào)用?
存儲過程是一個(gè)預(yù)編譯的SQL語句,優(yōu)點(diǎn)是允許模塊化的設(shè)計(jì),就是說只需創(chuàng)建一次,以后在該程序中就可以調(diào)用多次。如果某次操作需要執(zhí)行多次SQL,使用存儲過程比單純SQL語句執(zhí)行要快。
?
調(diào)用:
1)可以用一個(gè)命令對象來調(diào)用存儲過程。
2)可以供外部程序調(diào)用,比如:java程序。
5.存儲過程的優(yōu)缺點(diǎn)?
優(yōu)點(diǎn):
1)存儲過程是預(yù)編譯過的,執(zhí)行效率高。
2)存儲過程的代碼直接存放于數(shù)據(jù)庫中,通過存儲過程名直接調(diào)用,減少網(wǎng)絡(luò)通訊。
3)安全性高,執(zhí)行存儲過程需要有一定權(quán)限的用戶。
4)存儲過程可以重復(fù)使用,可減少數(shù)據(jù)庫開發(fā)人員的工作量。
缺點(diǎn):
移植性差
6.存儲過程與函數(shù)的區(qū)別
1、存儲過程bai:存儲過程是du SQL 語句和可選控制流語句的預(yù)編譯集合,以一dao個(gè)名稱存儲并作為一個(gè)單元處理。
2、函數(shù):是由一個(gè)或多個(gè) SQL 語句組成的子程序,可用于封裝代碼以便重新使用。?函數(shù)限制比較多,如不能用臨時(shí)表,只能用表變量等
7.什么叫視圖?游標(biāo)是什么?
視圖:
是一種虛擬的表,具有和物理表相同的功能??梢詫σ晥D進(jìn)行增,改,查,操作,試圖通常是有一個(gè)表或者多個(gè)表的行或列的子集。對視圖的修改會影響基本表。它使得我們獲取數(shù)據(jù)更容易,相比多表查詢。
游標(biāo):
是對查詢出來的結(jié)果集作為一個(gè)單元來有效的處理。游標(biāo)可以定在該單元中的特定行,從結(jié)果集的當(dāng)前行檢索一行或多行??梢詫Y(jié)果集當(dāng)前行做修改。一般不使用游標(biāo),但是需要逐條處理數(shù)據(jù)的時(shí)候,游標(biāo)顯得十分重要。
8.視圖的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1對數(shù)據(jù)庫的訪問,因?yàn)橐晥D可以有選擇性的選取數(shù)據(jù)庫里的一部分。
2)用戶通過簡單的查詢可以從復(fù)雜查詢中得到結(jié)果。
3)維護(hù)數(shù)據(jù)的獨(dú)立性,試圖可從多個(gè)表檢索數(shù)據(jù)。
4)對于相同的數(shù)據(jù)可產(chǎn)生不同的視圖。
缺點(diǎn):
性能:查詢視圖時(shí),必須把視圖的查詢轉(zhuǎn)化成對基本表的查詢,如果這個(gè)視圖是由一個(gè)復(fù)雜的多表查詢所定義,那么,那么就無法更改數(shù)據(jù)
9.drop、truncate、 delete區(qū)別
最基本:
drop直接刪掉表。
truncate刪除表中數(shù)據(jù),再插入時(shí)自增長id又從1開始。
delete刪除表中數(shù)據(jù),可以加where字句。
(1) DELETE語句執(zhí)行刪除的過程是每次從表中刪除一行,并且同時(shí)將該行的刪除操作作為事務(wù)記錄在日志中保存以便進(jìn)行進(jìn)行回滾操作。TRUNCATE TABLE 則一次性地從表中刪除所有的數(shù)據(jù)并不把單獨(dú)的刪除操作記錄記入日志保存,刪除行是不能恢復(fù)的。并且在刪除的過程中不會激活與表有關(guān)的刪除觸發(fā)器。執(zhí)行速度快。
(2) 表和索引所占空間。當(dāng)表被TRUNCATE 后,這個(gè)表和索引所占用的空間會恢復(fù)到初始大小,而DELETE操作不會減少表或索引所占用的空間。drop語句將表所占用的空間全釋放掉。
(3) 一般而言,drop > truncate > delete
(4) 應(yīng)用范圍。TRUNCATE 只能對TABLE;DELETE可以是table和view
(5) TRUNCATE 和DELETE只刪除數(shù)據(jù),而DROP則刪除整個(gè)表(結(jié)構(gòu)和數(shù)據(jù))。
(6) truncate與不帶where的delete :只刪除數(shù)據(jù),而不刪除表的結(jié)構(gòu)(定義)drop語句將刪除表的結(jié)構(gòu)被依賴的約束(constrain),觸發(fā)器(trigger)索引(index);依賴于該表的存儲過程/函數(shù)將被保留,但其狀態(tài)會變?yōu)椋篿nvalid。
(7) delete語句為DML(data maintain Language),這個(gè)操作會被放到 rollback segment中,事務(wù)提交后才生效。如果有相應(yīng)的 tigger,執(zhí)行的時(shí)候?qū)⒈挥|發(fā)。
(8) truncate、drop是DLL(data define language),操作立即生效,原數(shù)據(jù)不放到 rollback segment中,不能回滾。
(9) 在沒有備份情況下,謹(jǐn)慎使用 drop 與 truncate。要?jiǎng)h除部分?jǐn)?shù)據(jù)行采用delete且注意結(jié)合where來約束影響范圍。回滾段要足夠大。要?jiǎng)h除表用drop;若想保留表而將表中數(shù)據(jù)刪除,如果與事務(wù)無關(guān),用truncate即可實(shí)現(xiàn)。如果和事務(wù)有關(guān),或老師想觸發(fā)trigger,還是用delete。
(10) Truncate table 表名 速度快,而且效率高,因?yàn)??truncate table 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統(tǒng)和事務(wù)日志資源少。DELETE 語句每次刪除一行,并在事務(wù)日志中為所刪除的每行記錄一項(xiàng)。TRUNCATE TABLE 通過釋放存儲表數(shù)據(jù)所用的數(shù)據(jù)頁來刪除數(shù)據(jù),并且只在事務(wù)日志中記錄頁的釋放。
(11) TRUNCATE TABLE 刪除表中的所有行,但表結(jié)構(gòu)及其列、約束、索引等保持不變。新行標(biāo)識所用的計(jì)數(shù)值重置為該列的種子。如果想保留標(biāo)識計(jì)數(shù)值,請改用 DELETE。如果要?jiǎng)h除表定義及其數(shù)據(jù),請使用 DROP TABLE 語句。
(12) 對于由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應(yīng)使用不帶 WHERE 子句的 DELETE 語句。由于 TRUNCATE TABLE 不記錄在日志中,所以它不能激活觸發(fā)器。
?
10.什么是臨時(shí)表,臨時(shí)表什么時(shí)候刪除?
臨時(shí)表可以手動(dòng)刪除:
ROP?TEMPORARY?TABLE?IF?EXISTS?temp_tb;
臨時(shí)表只在當(dāng)前連接可見,當(dāng)關(guān)閉連接時(shí),MySQL會自動(dòng)刪除表并釋放所有空間。因此在不同的連接中可以創(chuàng)建同名的臨時(shí)表,并且操作屬于本連接的臨時(shí)表。
創(chuàng)建臨時(shí)表的語法與創(chuàng)建表語法類似,不同之處是增加關(guān)鍵字TEMPORARY,
如:
CREATE?TEMPORARY?TABLE?tmp_table?(
NAME?VARCHAR?(10)?NOT?NULL,
time?date?NOT?NULL
);
select?*?from?tmp_table;
*******************************************分割線***********************************
獲取完整版
由于題庫篇幅過長,完整題庫文檔我們提供了下載地址,請查看評論區(qū)哦!本題庫會持續(xù)更新,歡迎大家及時(shí)關(guān)注哦!