魚皮面試鴨30天后端面試營

day1

1. MySQL的索引類型有哪些?

MySQL里的索引就像是書的目錄,能幫數據庫快速找到你要的數據。以下是各種索引類型的通俗解釋:

按數據結構分

  • B+樹索引:最常用的一種,數據像在一棵樹上分層存放,能快速定位范圍數據,比如查找某個分數區間內的學生成績。
  • 哈希索引:通過把數據變成哈希值來建立索引,查找速度特別快,但只適合精確查找,比如根據身份證號找特定的人,要是找某個范圍的就不行了。
  • 倒排索引(全文索引):主要用來處理文本數據,比如在一篇文章里找特定的詞,它會記錄每個詞在哪些文檔里出現過。
  • R - 樹索引:用于處理多維空間數據,比如地圖上查找某個區域內的所有店鋪。

基于InnoDB B+樹索引分

  • 聚簇索引:數據和索引是放在一起的,就像書的正文和目錄裝訂在一起,一般主鍵會默認是聚簇索引,找數據時速度快。
  • 非聚簇索引:數據和索引分開存放,就像書的正文和目錄分開,查找到索引后還得再去查數據。

按索引性質分

  • 普通索引:最基本的索引,用來加快查詢速度,比如在學生表中給姓名字段建普通索引,查特定姓名的學生更快。
  • 主鍵索引:特殊的唯一索引,每個表只能有一個,就像每個人的身份證號,不能重復且必須有,用來唯一標識一行數據。
  • 聯合索引:把多個字段組合起來建索引,比如在學生表中把班級和成績兩個字段建聯合索引,查某個班級特定成績范圍的學生時會更高效。
  • 唯一索引:保證索引列的值不能重復,但可以有NULL值,比如員工表中員工編號字段建唯一索引。
  • 全文索引:上面按數據結構分的時候講過,用于在文本中快速查找特定詞匯。
  • 空間索引:和R - 樹索引類似,用于處理地理空間等數據,比如查找某個城市內的所有加油站。

2.MySQLInnoDB 引擎中的聚簇索引和非聚簇索引有什么區別?

聚簇索引

  • “索引葉子結點存儲的是數據行,可以直接訪問完整數據”:就好比一本書,它的目錄后面直接跟著對應的正文內容。在聚簇索引里,索引的最底層(葉子結點)存的不只是索引信息,而是整行的數據。所以當你通過聚簇索引去查找數據時,一下子就能拿到完整的一行數據,不用再去別的地方找。
  • “每個表只能有一個聚簇索引,通常是主鍵索引,適合范圍查詢和排序”:每個表就像一本獨特的書,只能有一份這種目錄和正文緊密相連的結構,也就是只能有一個聚簇索引。一般情況下,主鍵就充當了這個聚簇索引,因為主鍵能唯一確定一行數據。如果要查找某個范圍的數據,比如找成績在80 - 90分之間的學生記錄,或者要對數據進行排序,聚簇索引處理起來就比較高效,因為數據在物理存儲上是按照一定順序排列的。

非聚簇索引

  • “索引葉子節點存儲的是數據行的主鍵和對應的索引列,需通過主鍵才能訪問完整的數據行”:非聚簇索引像是另外單獨的一個小目錄,這個小目錄里記錄的是數據行的主鍵信息以及對應的索引列信息。當你通過這個小目錄找到對應的主鍵后,還得再去聚簇索引那里,根據主鍵把完整的數據行找出來,就好像你先在小目錄里查到頁碼,還得去書的正文里找具體內容。
  • “一個表可以有多個非聚簇索引(稱之為非主鍵索引、輔助索引、二級索引),適用于快速查找特定列的數據”:一個表可以有很多個這樣的小目錄,也就是可以有多個非聚簇索引。當你只需要查找表中的某一個或幾個特定列的數據時,用非聚簇索引就比較快。比如你只想查學生表中的學生姓名,在姓名字段上建了非聚簇索引的話,就能快速定位到這些姓名信息。

3. MySQL 的存儲引擎有哪些?它們之間有什么區別?

InnoDB

  • 支持事務、行級鎖和外鍵:事務就像一個打包任務,要么全成功,要么全失敗,比如轉賬時同時增減雙方賬戶金額。行級鎖是只鎖定要處理的那一行數據,這樣別人還能操作其他行,就像你在圖書館占一個座位,不妨礙別人坐其他座位。外鍵能把不同表的數據關聯起來,比如學生表和成績表通過學號關聯。
  • 提供高并發性能,適用于高負載的OLTP應用:可以同時處理很多人的操作請求,像銀行系統很多人同時轉賬、查詢等。
  • 數據以聚集索引的方式存儲,提高檢索效率:數據存放方式讓查找速度變快,就像書的目錄和正文放一起,找內容方便。

MyISAM

  • 不支持事務和外鍵,使用表級鎖:沒有事務打包功能,也不能關聯不同表數據。表級鎖是鎖定整張表,就像你把整個圖書館占了,別人都不能用。
  • 適合讀取多、更新少的場景,如數據倉庫:如果只是經常查數據,很少改數據,用它就挺好,像公司用來分析歷史數據的數據倉庫。
  • 具有較高的讀性能和較快的表級鎖定:讀數據速度快,鎖定表也快。

MEMORY

  • 數據存儲在內存中,速度快,但數據在服務器重啟后丟失:數據放在內存里,訪問就像在眼前拿東西一樣快。不過服務器一重啟,內存里的數據就沒了,就像電腦重啟后沒保存的臨時文件沒了。
  • 適用于臨時數據存儲或快速緩存:比如存臨時計算結果,或者做快速緩存來加快訪問。

NDB (NDCluster)

  • 支持高可用性和數據分布,適合大規模分布式應用:能保證服務一直可用,數據還能分散存,適合像大型電商平臺那種大規模分布式系統。
  • 提供行級鎖和自動分區:行級鎖不影響別人操作其他行,自動分區把數據分到不同地方存,提高性能。

ARCHIVE

  • 用于存儲大量歷史數據,支持高效的插入和壓縮:適合存公司多年的歷史訂單等大量歷史數據,存數據快還能壓縮節省空間。
  • 不支持索引,適合日志數據存儲:不能用索引快速查找,但存日志數據很合適,反正日志主要是按順序記錄。

day2

1.MySQL 索引的最左前綴匹配原則是什么?

把 MySQL 索引想象成一本字典。字典前面有個目錄,我們可以快速找到想要的字,MySQL 索引就和這目錄類似,能幫數據庫快速找到數據。最左前綴匹配原則,就像是查字典時按照順序查一樣。

聯合索引就像多層目錄

在 MySQL 里,如果我們給多個字段創建了聯合索引,這就好比字典有個多層的目錄。比如說,我們給一個表的姓、名這兩個字段建了聯合索引,這個聯合索引就像是字典先按姓排了個順序,在每個姓下面又按名排了順序。

必須從最左邊開始查找

最左前綴匹配原則要求我們查詢的時候得從聯合索引的最左邊字段開始用。還拿姓和名的聯合索引來說,如果我們只根據“名”去查,這個聯合索引就幫不上忙了,因為索引是先按姓排的。只有先根據“姓”查,然后可能再根據“名”進一步縮小范圍,索引才能發揮作用。

連續使用索引字段

再舉個例子,如果聯合索引是 (字段A, 字段B, 字段C) 。當我們查詢條件是 “字段A = 某個值” 時,索引能用;當查詢條件是 “字段A = 某個值 AND 字段B = 某個值” 時,索引也能用;當查詢條件是 “字段A = 某個值 AND 字段B = 某個值 AND 字段C = 某個值” 時,索引還是能用。但要是查詢條件是 “字段B = 某個值 AND 字段C = 某個值” ,沒有最左邊的字段A,索引就用不上了。而且查詢時字段得連續用,要是查詢條件是 “字段A = 某個值 AND 字段C = 某個值” ,跳過了字段B,那么索引也只能用到字段A,字段C那部分索引就不能用。

簡單來說,最左前綴匹配原則就是在使用聯合索引查詢時,要從最左邊的字段開始,按照順序連續使用索引里的字段,這樣索引才能高效地幫我們找到數據。

2.為什么 MySQL選擇使用 B+樹作為索引結構?

可以把 MySQL 里的數據想象成圖書館里的大量書籍,而索引就像是圖書館的目錄,能讓我們快速找到想要的書。MySQL 選擇 B+樹作為索引結構,主要有下面幾個原因:

1. 查找效率高

B+樹有個特點,它的所有數據都存放在葉子節點,而且葉子節點之間有指針相連,形成了一個有序鏈表。這就好比圖書館的目錄,把同一類書按照編號排得整整齊齊。當我們要查找某條數據時,就像在目錄里找對應的書編號,通過一層一層地比較節點上的值,能快速縮小查找范圍,找到我們想要的數據。而且不管數據量有多大,查找的時間都比較穩定,不會因為數據變多就慢很多。

2. 適合范圍查詢

在實際應用中,我們經常需要查詢某個范圍內的數據,比如查詢年齡在 20 到 30 歲之間的用戶。B+樹的葉子節點是有序的鏈表,這就方便極了。我們只要找到范圍的起始點,然后順著鏈表往后找,就能把這個范圍內的數據都找出來。就像在圖書館目錄里找到某一類書的起始編號,然后順著編號順序就能找到這一類里所有的書。

3. 磁盤讀寫性能好

數據庫的數據通常存放在磁盤上,磁盤讀寫是比較耗時的操作。B+樹的節點可以存儲多個鍵值對,每個節點對應磁盤上的一個頁。這樣一來,一次磁盤讀取能獲取更多的數據,減少了磁盤 I/O 的次數。就好比我們去圖書館借書,一次能多拿幾本,就不用來回跑那么多次了,效率自然就提高了。

4. 插入和刪除操作穩定

在數據庫里,數據是經常要進行插入和刪除操作的。B+樹在進行這些操作時,能通過節點的分裂和合并來保持樹的平衡,不會因為頻繁的插入和刪除導致樹的結構變得很混亂,影響查找效率。這就像圖書館的管理員,在不斷地添加和拿走書籍后,還能把書架整理得井井有條,讓我們還是能快速找到想要的書。

總的來說,B+樹的這些優點讓它很適合作為 MySQL 的索引結構,能讓數據庫在查找、插入、刪除等操作上都有比較好的性能表現。

3.MySQL 三層 B+樹能存多少數據?

要估算 MySQL 三層 B+ 樹能存多少數據,我們需要先了解 B+ 樹的結構特點,再分析每個節點大概能存儲多少數據,最后得出三層 B+ 樹的總存儲量。

B+ 樹結構基礎

B+ 樹是一種多路平衡查找樹,在 MySQL 里,B+ 樹的非葉子節點(索引節點)只存儲索引信息,而數據都存放在葉子節點中。葉子節點之間通過指針相連,形成有序鏈表。我們可以把 B+ 樹想象成一個多層的目錄結構,非葉子節點是上層目錄,葉子節點是最終存放具體內容的頁面。

計算各層節點可存儲的數據量

1. 假設前提
  • 一個數據頁的大小通常為 16KB(這是 MySQL InnoDB 存儲引擎默認的數據頁大小)。
  • 非葉子節點(索引節點)主要存儲索引鍵值和指向子節點的指針。假設一個索引鍵值和指針的組合大小為 8 字節(這只是為了方便計算做的假設,實際大小會因數據類型等因素而不同)。
  • 葉子節點存儲實際的數據記錄,假設一條數據記錄大小為 1KB(同樣是假設值,實際大小取決于表結構)。
2. 計算非葉子節點可存儲的子節點指針數量

由于一個數據頁大小是 16KB(即 16 * 1024 = 16384 字節),一個索引鍵值和指針組合大小為 8 字節,那么一個非葉子節點能存儲的子節點指針數量為:16384 ÷ 8 = 2048 個。

3. 分析三層 B+ 樹的存儲情況
  • 第一層(根節點):根節點是一個非葉子節點,它能存儲 2048 個指向第二層節點的指針。
  • 第二層(中間層非葉子節點):每個第二層的非葉子節點同樣能存儲 2048 個指向第三層節點的指針。因為根節點有 2048 個指針指向第二層節點,所以第二層總共有 2048 個非葉子節點,那么第二層所有節點能指向的第三層節點數量為 2048 × 2048 個。
  • 第三層(葉子節點):每個葉子節點存儲實際的數據記錄,假設一條記錄大小為 1KB,一個葉子節點(數據頁)能存儲 16 條記錄(16KB ÷ 1KB = 16)。由于第二層節點指向第三層的葉子節點數量為 2048 × 2048 個,所以三層 B+ 樹能存儲的數據記錄總數為 2048 × 2048 × 16 = 67108864 條。

需要注意的是,以上計算是基于假設的數據頁大小、索引鍵值和指針大小以及數據記錄大小得出的,實際情況中這些值會因表結構、數據類型等因素而有所不同,但通過這種方式能讓你大致了解三層 B+ 樹的存儲量級。

day3

day4

day5

day6

day7

day8

day9

day10

day11

day12

day13

day14

day15

day16

day17

day18

day19

day20

day21

day22

day23

day24

day25

day26

day27

day28

day29

day30

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71462.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71462.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71462.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【核心算法篇十二】《深入解剖DeepSeek多任務學習:共享表示層的24個設計細節與實戰密碼 》

引言:為什么你的模型總在"精神分裂"? 想象你訓練了一個AI實習生: 早上做文本分類時準確率90%下午做實體識別卻把"蘋果"都識別成水果公司晚上做情感分析突然開始輸出亂碼這就是典型的任務沖突災難——模型像被不同任務"五馬分尸"。DeepSeek通…

DeepSeek應用——與PyCharm的配套使用

目錄 一、配置方法 二、使用方法 三、注意事項 1、插件市場無continue插件 2、無結果返回,且在本地模型報錯 記錄自己學習應用DeepSeek的過程,使用的是自己電腦本地部署的私有化蒸餾模型...... (舉一反三,這個不單單是可以用…

2025最新智能優化算法:改進型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23個經典函數測試集,MATLAB

一、改進型雪雁算法 雪雁算法(Snow Geese Algorithm,SGA)是2024年提出的一種新型元啟發式算法,其靈感來源于雪雁的遷徙行為,特別是它們在遷徙過程中形成的獨特“人字形”和“直線”飛行模式。該算法通過模擬雪雁的飛行…

vscode通過ssh連接服務器實現免密登錄+刪除

文章目錄 參考: 1、 vscode通過ssh連接服務器實現免密登錄刪除(吐血總結)

MySQL 主從復制原理及其工作過程

一、MySQL主從復制原理 MySQL 主從復制是一種將數據從一個 MySQL 數據庫服務器(主服務器,Master)復制到一個或多個 MySQL 數據庫服務器(從服務器,Slave)的技術。以下簡述其原理,主要包含三個核…

【趙渝強老師】Spark RDD的緩存機制

Spark RDD通過persist方法或cache方法可以將計算結果的緩存,但是并不是這兩個方法被調用時立即緩存,而是觸發后面的action時,該RDD才會被緩存在計算節點的內存中并供后面重用。下面是persist方法或cache方法的函數定義: def pers…

設計模式相關知識點

目錄 設計模式 設計模式 代碼設計原則 設計模式 設計模式 干掉if...else,最好用的3種設計模式! | 小傅哥 bugstack 蟲洞棧 代碼設計原則-CSDN博客 23種設計模式-CSDN博客 策略模式(Strategy Pattern)-CSDN博客 責任鏈模式…

ShenNiusModularity項目源碼學習(9:項目結構)

ShenNiusModularity源碼主要有11個project(其實還有officialweb、test兩個文件夾,大致有4、5個project,但看著跟主要項目代碼沒太大關系,暫時不管),這11個project的依賴關系如下圖所示,其中最下…

ubuntu22.4搭建單節點es8.1

下載對應的包 elasticsearch-8.1.1-linux-x86_64.tar.gz 創建es租戶 groupadd elasticsearc useradd elasticsearch -g elasticsearch -p elasticsearch chmod uw /etc/sudoers chmod -R elasticsearch:elasticsearch elasticsearch 修改配置文件 vim /etc/sysctl.conf vm…

Docker 部署 ollama + DeepSeek

拉取并運行 Ollama Docker 鏡像 使用以下命令從 Docker Hub 拉取 Ollama 鏡像并運行容器: docker run -d -p 11434:11434 --name ollama ollama/ollama -d:以守護進程模式運行容器,即讓容器在后臺運行。-p 11434:11434:將容器內…

解決DeepSeek服務器繁忙的有效方法

全球42%的企業遭遇過AI工具服務器過載導致內容生產中斷(數據來源:Gartner 2025)。當競品在凌晨3點自動發布「智能家居安裝指南」時,你的團隊可能正因DeepSeek服務器繁忙錯失「凈水器保養教程」的流量黃金期?。147SEO智能調度系統…

Discuz! X3.5 根目錄權限設置

在 Discuz! X3.5 中,根目錄的權限設置是確保網站安全性和功能正常運行的關鍵。如果權限設置不當,可能會導致文件無法訪問、安全問題(如文件被篡改)或功能異常。以下是關于 Discuz! X3.5 根目錄權限設置的詳細說明和建議: 1. 根目錄位置 Discuz! X3.5 的根目錄通常是網站的…

【C++八股】內存對?

內存對齊是指編譯器按照特定規則安排數據在內存中的存儲位置,以提高程序的執行效率和可移植性。 內存對齊的原因: 1. 性能優化: 現代處理器通常要求數據在內存中按照特定的邊界對齊,以提高內存訪問效率。 如果數據未對齊&#x…

【有啥問啥】DeepSeek 技術原理詳解

DeepSeek 技術原理詳解 DeepSeek 是一款具有突破性技術的大型語言模型,其背后的技術原理涵蓋了多個方面,以下是對其主要技術原理的詳細介紹: 架構創新 多頭潛在注意力機制(MLA) 傳送門鏈接: DeepSeek V3中的Multi-…

ML.NET庫學習008:使用ML.NET進行心臟疾病預測模型開發

文章目錄 ML.NET庫學習008:使用ML.NET進行心臟疾病預測模型開發1. 項目主要目的和原理2. 項目概述實現的主要功能:主要流程步驟:關鍵技術: 3. 主要功能和步驟數據加載與路徑處理模型訓練與評估模型保存與加載 4. 代碼中的數據結構…

FFmpeg 全面知識大綱梳理

1. FFmpeg 簡介 FFmpeg 是什么: 一個開源的多媒體處理框架,用于處理音頻、視頻和流媒體。支持多種格式和編解碼器。提供命令行工具和庫(如 libavcodec, libavformat, libavfilter 等)。主要功能: 格式轉換編解碼流媒體處理音視頻剪輯、合并、分離添加濾鏡、特效壓縮與優化…

人工智能基礎之數學基礎:01高等數學基礎

函數 極限 按照一定次數排列的一列數:“,“,…,"…,其中u 叫做通項。 對于數列{Un}如果當n無限增大時,其通項無限接近于一個常數A,則稱該數列以A為極限或稱數列收斂于A,否則稱數列為發散, 極限值 左…

從零搭建微服務項目Base(第5章——SpringBoot項目LogBack日志配置+Feign使用)

前言: 本章主要在原有項目上添加了日志配置,對SpringBoot默認的logback的配置進行了自定義修改,并詳細闡述了xml文件配置要點(只對日志配置感興趣的小伙伴可選擇直接跳到第三節),并使用Feign代替原有RestT…

【關于電商數據采集】電商數據采集的市場應用及發展

## 電商數據采集應用行業介紹 **一、 行業概述** 電商數據采集應用行業是指利用技術手段,自動或半自動地從電商平臺、社交媒體等渠道獲取商品信息、用戶評論、銷售數據等信息的行業。隨著電子商務的蓬勃發展,數據已成為電商企業的重要資產,…

c++進階———繼承

1.引言 在一些大的項目中,我們可能要重復定義一些類,但是很麻煩,應該怎么辦呢?舉個簡單的例子,我要做一個全校師生統計表,統計學號,教師編號,姓名,年齡,電話…