共計(jì) 2758 個(gè)字符,預(yù)計(jì)需要花費(fèi) 7 分鐘才能閱讀完成。
本篇內(nèi)容介紹了“必須掌握的數(shù)據(jù)庫(kù)面試題有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓丸趣 TV 小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
一、為什么使用數(shù)據(jù)索引能提高效率
數(shù)據(jù)索引的存儲(chǔ)是 有序的
在有序的情況下, 通過(guò)索引查詢(xún)一個(gè)數(shù)據(jù)是無(wú)需遍歷索引記錄的
極端情況下,數(shù)據(jù)索引的查詢(xún)效率為二分法查詢(xún)效率, 趨近于 log2(N)
二、B+ 樹(shù)索引和哈希索引的區(qū)別
B+ 樹(shù)是一個(gè)平衡的多叉樹(shù),從根節(jié)點(diǎn)到每個(gè)葉子節(jié)點(diǎn)的高度差值不超過(guò) 1, 而且同層級(jí)的節(jié)點(diǎn)間有指針相互鏈接,是有序的,如下圖:
哈希索引就是采用一定的哈希算法,把鍵值換算成新的哈希值,檢索時(shí)不需要類(lèi)似 B + 樹(shù)那樣從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)逐級(jí)查找,只需一次哈希算法即可, 是無(wú)序的,如下圖所示:
三、哈希索引的優(yōu)勢(shì):
等值查詢(xún),哈希索引具有絕對(duì)優(yōu)勢(shì) (前提是: 沒(méi)有大量重復(fù)鍵值,如果大量重復(fù)鍵值時(shí),哈希索引的效率很低,因?yàn)榇嬖谒^的哈希碰撞問(wèn)題。
四、哈希索引不適用的場(chǎng)景:
不支持 范圍查詢(xún)
不支持索引完成排序
不支持聯(lián)合索引的最左前綴匹配規(guī)則
五、什么是表分區(qū)?
表分區(qū),是指根據(jù)一定規(guī)則,將數(shù)據(jù)庫(kù)中的一張表分解成多個(gè)更小的,容易管理的部分。從邏輯上看,只有一張表,但是底層卻是由多個(gè)物理分區(qū)組成
六、表分區(qū)與分表的區(qū)別?
分表:指的是通過(guò)一定規(guī)則,將一張表分解成多 張不同的表。比如將用戶(hù)訂單記錄根據(jù)時(shí)間成多個(gè)表。
分表與分區(qū)的區(qū)別在于: 分區(qū)從邏輯上來(lái)講只有一張表 , 而分表則是將一張表分解成多張表。
七、表分區(qū)有什么好處?
鴻蒙官方戰(zhàn)略合作共建——HarmonyOS 技術(shù)社區(qū)
存儲(chǔ)更多數(shù)據(jù)。分區(qū)表的數(shù)據(jù)可以分布在不同的物理設(shè)備上,從而高效地利用多個(gè)硬件設(shè)備。和單個(gè)磁盤(pán)或者文件系統(tǒng)相比,可以存儲(chǔ)更多數(shù)據(jù)
優(yōu)化 E 詢(xún)。在 where 語(yǔ)句中包含分區(qū)條件時(shí),可以只掃描一個(gè)或多 個(gè)分區(qū)表來(lái)提高查詢(xún)效率; 涉及 sum 和 count 語(yǔ)句時(shí),也可以在多個(gè)分區(qū)上并行處理,最后匯總結(jié)果。
分區(qū)表更容易維護(hù)。例如: 想批量刪除大量數(shù)據(jù)可以清除整個(gè)分區(qū)。
避免某些特殊的瓶頸,例如 InnoDB 的單個(gè)索引的互斥訪(fǎng)問(wèn),ext3 問(wèn)價(jià)你系統(tǒng)的 inode 鎖競(jìng)爭(zhēng)等。
八、在 MVCC 并發(fā)控制中, 讀操作可以分成兩類(lèi):
快照讀 (snapshot read): 讀取的是記錄的可見(jiàn)版本 (有可能是歷史版本),不用加鎖 (共享讀鎖 s 鎖也不加,所以不會(huì)阻塞其他事務(wù)的寫(xiě))
當(dāng)前讀 (currentread): 讀取的是記錄的最新版本,并且,當(dāng)前讀返回的記錄,都會(huì)加上鎖,保證其他事務(wù)不會(huì)再并發(fā)修改這條記錄
九、行級(jí)鎖定的優(yōu)點(diǎn):
鴻蒙官方戰(zhàn)略合作共建——HarmonyOS 技術(shù)社區(qū)
當(dāng)在許多線(xiàn)程中訪(fǎng)問(wèn)不同的行時(shí)只存在少量鎖定沖突。
回滾時(shí)只有少量的更改
可以長(zhǎng)時(shí)間鎖定單一的行。
十、行級(jí)鎖定的缺點(diǎn):
比頁(yè)級(jí)或表級(jí)鎖定占用更多的內(nèi)存。當(dāng)在表的大部分中使用時(shí),比頁(yè)級(jí)或表級(jí)鎖定速度慢,因?yàn)槟惚仨毇@取更多的鎖。如果你在大部分?jǐn)?shù)據(jù)上經(jīng)常進(jìn)行 GROUP BY 操作或者必須經(jīng)常掃描整個(gè)表,比其它鎖定明顯慢很多。用高級(jí)別鎖定,通過(guò)支持不同的類(lèi)型鎖定, 你也可以很容易地調(diào)節(jié)應(yīng)用程序,因?yàn)槠滏i成本小于行級(jí)鎖定。
十一、MySQL 優(yōu)化
開(kāi)啟查詢(xún)緩存,優(yōu)化查詢(xún)
explain 你的 select 查詢(xún),這可以幫你分析你的查詢(xún)語(yǔ)句或是表結(jié)構(gòu)的性能瓶頸。EXPLAIN 的查詢(xún)結(jié)果還會(huì)告訴你你的索引 主鍵被如何利用的,你的數(shù)據(jù)表是如何被搜索和排序的
當(dāng)只要一行數(shù)據(jù)時(shí)使用 limit 1, MySQL 數(shù)據(jù)庫(kù)引擎會(huì)在找到一條數(shù)據(jù)后停止搜索, 而不是繼續(xù)往后查少下一條符合記錄的數(shù)據(jù)
為搜索字段建索引
使用 ENUM 而不是 VARCHAR
Prepared StatementsPrepared Statements 很像存儲(chǔ)過(guò)程, 是一種運(yùn)行在后臺(tái)的 SQL 語(yǔ)句集合, 我們可以從使用
prepared statements 獲得很多好處,無(wú)論是性能問(wèn)題還是安全問(wèn)題。
Prepared Statements 可以檢查一些你綁定好的變量,這樣可以保護(hù)你的程序不會(huì)受到“SQL 注入式”攻擊
垂直分表
選擇正確的存儲(chǔ)引擎
十二、key 和 index 的區(qū)別
key 是數(shù)據(jù)庫(kù)的物理結(jié)構(gòu),它包含兩層意義和作用,一是約束 (偏 重于約束和規(guī)范數(shù)據(jù)庫(kù)的結(jié)構(gòu)完整性) , 二是索引 (輔助查詢(xún) 用的)。包括 primary key, unique key, foreign key 等
index 是數(shù)據(jù)庫(kù)的物理結(jié)構(gòu),它只是輔助查詢(xún)的,它創(chuàng)建時(shí)會(huì)在另外的表空間 (mysql 中的 innodb 表空間) 以 - 個(gè)類(lèi)似目錄的結(jié) 構(gòu)存儲(chǔ)。索引要分類(lèi)的話(huà),分為前綴索引、全文本索引等;
十三、Mysql 中 MyISAM 和 InnoDB 的區(qū)別有哪些?
鴻蒙官方戰(zhàn)略合作共建——HarmonyOS 技術(shù)社區(qū)
InnoDB 支持事務(wù), MyISAM 不支持
InnoDB 支持外鍵,而 MylSAM 不支持。對(duì)一個(gè)包含外鍵的 InnoDB 表轉(zhuǎn)為 MYISAM 會(huì)失敗;
InnoDB 是聚集索引,數(shù)據(jù)文件是和索引綁在一起,必須要有主鍵,通過(guò)主鍵索引效率高。
InnoDB 不保存 表的具體行數(shù), 執(zhí)行 select count(*) from table 時(shí)需要全表掃描。
Innodb 不支持全文索引,而 MyISAM 支持全文索引, 查詢(xún)效率上 MyISAM 要高;
十四、數(shù)據(jù)庫(kù)表創(chuàng)建注意事項(xiàng)
1、字段名及字段配制合理性
剔除關(guān)系不密切的字段; 1 字段命名要有規(guī)則及相對(duì)應(yīng)的含義 (不要一部分英文,一部分拼音,還有類(lèi)似 a.b.c 這樣不明含義的字段) ;
字段命名盡量不要使用縮寫(xiě) (大多數(shù)縮寫(xiě)都不能明確字段含義) ;
字段不要大小寫(xiě)混用 (想要具有可讀性,多個(gè)英文單詞可使用下劃線(xiàn)形式連接) ;
字段名 不要使用保留字或者關(guān)鍵字;
保持字段名和類(lèi)型的一致性;
慎重選擇數(shù)字類(lèi)型; 給文本字段留足余量;
2、系統(tǒng)特殊字段處理及建成后建議
添加刪除標(biāo)記 (例如操作人、刪除時(shí)間) ;
建立版本機(jī)制;
3、表結(jié)構(gòu)合理性配置
多型字段的處理,就是表中是否存在字段能夠分解成更小獨(dú)立的幾部分 (例如: 人可以分為男人和女人) ;
多值字段的處理,可以將表分為三張表,這樣使得檢索和排序更加有調(diào)理,且保證數(shù)據(jù)的完整性!
4、其它建議
對(duì)于大數(shù)據(jù)字段,獨(dú)立表進(jìn)行存儲(chǔ), 以便影響性能 (例如: 簡(jiǎn)介字段) ;
使用 varchar 類(lèi) 型代替 char, 因?yàn)?varchar 會(huì)動(dòng)態(tài)分配長(zhǎng)度,char 指定長(zhǎng)度是固定的; 給表創(chuàng)建主鍵,對(duì)于沒(méi)有主鍵的表,在查詢(xún)和索引定義上有一定的影響;
避免表字段運(yùn)行為 null, 建議設(shè)置默認(rèn)值 (例如: int 類(lèi)型設(shè)置默認(rèn)值為 0) 在索引查詢(xún)上,效率立顯; 1 建立索引, 最好建立在唯 - 和非空的字段上,建立太多的索引對(duì)后期插入、更新都存在一定的影響 (考慮實(shí)際情況來(lái)創(chuàng)建) ;
“必須掌握的數(shù)據(jù)庫(kù)面試題有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編將為大家輸出更多高質(zhì)量的實(shí)用文章!