【Java高頻面試問題】數據庫篇

【Java高頻面試問題】數據庫篇

  • 為什么MySQL選擇B+樹作為索引
    • 一、B+ 樹的優勢特性
    • 二、與常見數據結構的對比
  • 索引優化
    • 一、索引類型及使用場景
    • 二、索引優化核心策略
      • 1. 避免索引失效場景
      • 2. 性能優化實踐
      • 3. 表結構與架構優化
    • 三、高頻面試問題參考答案
    • 總結:面試核心要點
  • 數據庫事務
    • 一、事務基礎
    • ?二、事務隔離級別
    • ?三、Spring 事務管理
      • 1. ?傳播機制(高頻考點)
      • 2. ?事務失效場景
    • 四、并發事務的控制方式
      • ?1、鎖機制(Locking)
      • 2、時間戳排序(Timestamp Ordering)
      • 3、樂觀并發控制(OCC)
      • 4、多版本并發控制(MVCC)
      • 💎 ?總結對比
    • ?五、高級考點
  • 線上慢SQL查詢優化

為什么MySQL選擇B+樹作為索引

MySQL 選擇 B+ 樹作為索引結構是綜合磁盤 I/O 效率、范圍查詢能力、存儲利用率等因素的結果,其核心優勢如下(對比其他數據結構):

一、B+ 樹的優勢特性

  1. 多路平衡樹結構降低樹高?

    • 每個節點可存儲大量鍵值(通常數百個),千萬級數據樹高僅 ?3-4 層?(二叉樹需 ?20+ 層?),減少磁盤 ?I/O 次數?(查詢耗時從 O(n) 優化至 O(log n))。
    • 示例?:查詢 1000 萬數據,B+ 樹僅需 ?3-4 次 I/O?,二叉樹需 ?20+ 次 I/O?。
  2. ?葉子節點有序鏈表支持高效范圍查詢?

    • 葉子節點通過雙向指針連接,范圍查詢(如 BETWEENORDER BY)直接遍歷鏈表,?無需回溯父節點?。
    • 對比哈希索引?:哈希僅支持等值查詢,無法高效處理范圍操作。
  3. ?非葉子節點不存數據,提升存儲利用率?

    • 非葉子節點僅存?索引鍵+指針?(不存實際數據),單節點可容納更多鍵值:

    • 1GB 索引?中非葉子節點約占 ?**10%?,葉子節點占 ?90%**?,顯著提升緩存命中率。

    • 對比 B 樹?:B 樹非葉子節點存數據,導致 ?相同數據量下樹高增加 1 層?。

二、與常見數據結構的對比

?索引類型??范圍查詢??樹高/IO次數??寫入性能??適用場景?
?B+ 樹?? 高效? 極低 (3-4層)? 平衡OLTP、高頻范圍查詢
?二叉樹/紅黑樹?? 支持? 高 (O(n) 退化風險)?? 頻繁旋轉維護成本內存數據結構
?哈希索引?? 不支持? O(1)? 高等值查詢場景
?B 樹??? 部分支持?? 較高 (比B+樹多1層)? 平衡文件系統

二叉樹(紅黑樹):節點僅存 1 個鍵值,樹高過大導致 I/O 次數劇增,且插入刪除需頻繁旋轉維護平衡。

B 樹范:非葉子節點存數據,導致樹高增加、范圍查詢效率低于 B+ 樹。

哈希索引:不支持范圍掃描。

索引優化

一、索引類型及使用場景

?索引類型??特點??適用場景?
?主鍵索引?唯一、非空,聚簇索引結構表的主鍵字段
?唯一索引?列值唯一,允許 NULL業務唯一字段(如手機號)
?聯合索引?多列組合,遵循最左前綴匹配原則多條件查詢(如 WHERE a=1 AND b=2
?覆蓋索引?查詢字段均在索引中,避免回表高頻查詢的字段組合

?? ?聯合索引陷阱?:

  • 違反最左前綴原則導致失效(如索引 (a,b,c),條件 WHERE b=2 不生效)
  • 范圍查詢右側列失效(如 WHERE a>1 AND b=2b 無法用索引)

二、索引優化核心策略

1. 避免索引失效場景

?失效場景??示例??原因??解決方案?
?對索引列使用函數?WHERE YEAR(create_time)=2023函數操作破壞索引值的有序性,優化器無法直接匹配索引樹結構改用范圍查詢:WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'
?隱式類型轉換?WHERE phone=13800138000(phone為VARCHAR)類型不匹配觸發隱式轉換,導致索引字段計算(如字符串轉數字)統一類型:WHERE phone='13800138000'
?左模糊查詢?WHERE name LIKE '%abc'通配符在前使B+樹無法利用前綴匹配特性,退化為全表掃描改用右模糊:LIKE 'abc%' 或全文索引
?OR條件部分無索引?WHERE a=1 OR b=2(b無索引)優化器判定全表掃描成本低于“索引+回表”組合操作拆分為UNION ALL或為b建索引
?違反最左前綴原則?WHERE b=1 AND c=2(聯合索引為(a,b,c))跳過最左列導致索引樹無法定位數據區間查詢條件必須包含最左列(如WHERE a=1 AND b=1
?范圍查詢后索引失效?WHERE a>1 AND b=2(聯合索引(a,b))范圍查詢導致后續索引列無法使用有序性調整列順序或拆分為單列查詢
?IS NOT NULL條件?WHERE a IS NOT NULL非覆蓋索引時需回表驗證數據是否存在,成本可能高于全表掃描

2. 性能優化實踐

  • ?EXPLAIN 分析 SQL?:
EXPLAIN SELECT * FROM users WHERE age > 25;

關注 type(掃描類型)、key(使用索引)、Extra(是否覆蓋索引)

  • ?慢查詢定位?:

    • 開啟慢日志:slow_query_log=1, long_query_time=2
    • 使用 SHOW PROFILE 分析執行耗時
  • ?索引覆蓋優化?:

-- 原查詢需回表  
SELECT id, name, age FROM users WHERE city='Beijing';  
-- 創建覆蓋索引(InnoDB 二級索引隱式包含主鍵)
CREATE INDEX idx_city_name_age ON users(city, name, age);

3. 表結構與架構優化

  • ?垂直分表?:拆分大字段(如 TEXT)到單獨表,減少主表 I/O
  • ?讀寫分離?:主庫寫 + 從庫讀,分散壓力
  • ?冷熱數據分離?:歸檔歷史數據,減少主表體積

三、高頻面試問題參考答案

  1. ?B+Tree 為什么比 B-Tree 適合數據庫索引?

B+Tree 非葉節點不存數據,單頁存儲更多鍵值,降低樹高度;葉子節點鏈表支持高效范圍查詢,減少磁盤隨機 I/O

  1. ?如何優化深分頁 LIMIT 1000000,10

使用主鍵覆蓋索引,避免全表掃描

SELECT * FROM table WHERE id > (SELECT id FROM table ORDER BY id LIMIT 1000000,1) LIMIT 10;
  1. ?聯合索引 (a,b,c),WHERE b=1 AND c=2 是否生效?

??,違反最左前綴原則。需至少包含 a 字段(如 WHERE a=1 AND b=1

總結:面試核心要點

?方向??關鍵點?
?底層原理?B+Tree 結構優勢、聚簇索引/二級索引區別、回表機制
?優化策略?最左前綴原則、覆蓋索引、索引失效場景規避、EXPLAIN 分析
?架構設計?讀寫分離、分庫分表、冷熱數據分離
?問題排查?慢查詢日志定位、PROFILE 分析、索引使用監控

終極建議?:結合業務場景設計索引(高頻查詢字段優先),避免過度索引;所有優化需通過 EXPLAIN 驗證

數據庫事務

數據庫事務可以保證多個對數據庫的操作構成一個邏輯上的整體。要么全部執行成功,要么全部不執行

一、事務基礎

  1. ?ACID 特性?

    • ?原子性 (Atomicity):事務操作要么全成功,要么全失敗回滾(如轉賬操作)。
    • ?一致性 (Consistency) ?:事務執行前后數據完整性不被破壞(如庫存不為負)。
    • ?隔離性 (Isolation) ?:并發事務相互隔離,互不干擾。
    • ?持久性 (Durability) ?:事務提交后數據永久存儲(如訂單持久化)。

🌈 補充:只有保證了事務的持久性、原子性、隔離性之后,一致性才能得到保障。也就是說 A、I、D 是手段,C 是目的!

  1. ?并發事務問題?

    • ?臟讀?:讀取到其他事務未提交的數據。
    • ?不可重復讀?:同一事務內多次讀取同一數據結果不同 (因其他事務修改)。
    • ?幻讀?:同一查詢條件返回結果集數量變化 (因其他事務增刪數據)。

?二、事務隔離級別

隔離級別臟讀不可重復讀幻讀說明
?READ UNCOMMITTED????最低隔離,可能讀到未提交數據。
?READ COMMITTED????僅讀取已提交數據 (Oracle 默認),解決臟讀。
?REPEATABLE READ????保證多次讀取結果一致 (MySQL 默認),解決臟讀、不可重復讀。
?SERIALIZABLE????完全串行化,性能最低但解決所有問題。

📌 ?MySQL 默認隔離級別為 REPEATABLE READ ,通過 MVCC 機制實現一致性讀。

?三、Spring 事務管理

1. ?傳播機制(高頻考點)

  • PROPAGATION_REQUIRED?(默認):當前有事務則加入,無則新建。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {methodB(); // 加入同一事務
}
  • PROPAGATION_REQUIRES_NEW?:掛起當前事務,新建獨立事務。
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() { /* 新事務執行 */ }
  • PROPAGATION_NESTED?:嵌套事務,外層失敗時回滾內層操作。

2. ?事務失效場景

  • public 方法使用 @Transactional
  • 自調用(同類方法內部調用)導致代理失效。
  • 異常類型錯誤(默認僅回滾 RuntimeException)或異常被捕獲未拋出。
  • 未配置事務管理器或數據源問題。

四、并發事務的控制方式

?1、鎖機制(Locking)

通過對數據對象加鎖限制并發訪問,分為兩類:

  • 共享鎖(S鎖/讀鎖):允許事務讀取數據,阻止其他事務加排他鎖(但允許多個事務同時加讀鎖)。

  • 排他鎖(X鎖/寫鎖):允許事務修改數據,阻止其他事務加任何鎖。

  • ?封鎖協議?:

    • 一級封鎖:寫前加X鎖,事務結束釋放(防丟失修改)。
    • 二級封鎖:讀前加S鎖(防臟讀),寫前加X鎖,讀后即釋S鎖。
    • 三級封鎖:讀前加S鎖、寫前加X鎖,所有鎖事務結束釋放(防不可重復讀)。

2、時間戳排序(Timestamp Ordering)

為每個事務分配唯一時間戳,按時間順序調度操作:

  • ?規則?:若事務T1時間戳早于T2,則T1操作優先執行,沖突時回滾時間戳大的事務。
  • ?優點?:避免死鎖,但需全局時鐘維護時序。

3、樂觀并發控制(OCC)

假設事務沖突概率低,分三階段執行:

  • ?讀階段?:記錄讀寫集,不立即加鎖。
  • 驗證階段?:提交前檢測讀寫沖突(如向后/向前校驗)。
  • 寫階段?:無沖突則提交,否則回滾重試。

適用場景?:低沖突、讀多寫少環境。

4、多版本并發控制(MVCC)

維護數據多個歷史版本,實現讀寫分離:

  • ?讀操作?:訪問事務開始時的快照版本(避免阻塞寫操作)。

  • ?寫操作?:創建新版本,不影響正在讀取的舊版本。

  • ?典型應用?:

    • MySQL的REPEATABLE READ隔離級別通過MVCC解決不可重復讀。
    • Oracle采用MVCC優化行級鎖,減少阻塞。

💎 ?總結對比

?方法??核心思想??優勢??劣勢?
?鎖機制?強制串行訪問強一致性,實現簡單死鎖風險,并發度低
?時間戳排序?按時間順序調度無死鎖時鐘同步難,事務重啟率高
?樂觀控制?提交時沖突檢測高并發,減少鎖開銷高沖突時頻繁回滾
?MVCC?多版本快照讀讀寫無阻塞,高并發版本存儲開銷大

📌 ?實踐選擇?:單機高并發首選MVCC(如MySQL);分布式系統常組合使用MVCC與時間戳(如CockroachDB);低沖突場景可采用OCC優化性能。

?五、高級考點

  1. ?分布式事務?
  • CAP 理論?:一致性 (Consistency)、可用性 (Availability)、分區容錯性 (Partition Tolerance) 不可兼得。

  • 解決方案?:

    • ?2PC (兩階段提交):強一致,但存在同步阻塞問題。
    • ?TCC (補償事務):通過 Try/Confirm/Cancel 柔性事務保證最終一致。
    • ?Seata 等框架?:基于 AT 模式自動回滾。
  1. ?事務日志與鎖機制?

    • ?Redo Log?:保證持久性,記錄物理修改。
    • ?Undo Log?:保證原子性,記錄事務回滾所需信息。
    • ?鎖分類?:樂觀鎖 (CAS)、悲觀鎖 (行鎖/表鎖)。

線上慢SQL查詢優化

  1. ?定位慢SQL?

    • ?日志監控?:開啟MySQL慢查詢日志(slow_query_log=ON, long_query_time=1
    • ?連接池工具?:Druid監控面板(記錄執行耗時、最慢SQL排行)或云平臺慢SQL分析功能
  2. ?分析執行計劃:關鍵字段分析?

    EXPLAIN SELECT * FROM orders WHERE user_id=100;
    
    • type:效率排序 const > ref > range > index > ALL(避免全表掃描)
    • rows:掃描行數(越少越好)
    • ExtraUsing filesort(需排序優化)、Using temporary(需避免臨時表)
  3. ?制定優化方案?

    • 索引優化 → SQL重寫 → 分頁/表結構優化 → 業務/架構優化

持續更新中…

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

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

相關文章

《Whisper:開啟語音識別新時代的鑰匙》

Whisper 模型:技術革新的基石 在當今科技飛速發展的時代,自動語音識別(ASR)技術作為人工智能領域的關鍵分支,正深刻地改變著人們的生活與工作方式。從智能語音助手到實時字幕生成,從語音交互設備到智能客服系統,ASR 技術無處不在,為人們帶來了前所未有的便利與效率提升…

關于 pdd:anti_content參數分析與逆向

一、逆向目標 目標:獲取pdd商品列表接口數據網址:aHR0cHM6Ly93d3cucGluZHVvZHVvLmNvbS9ob21lL2hvbWUv 二、逆向步驟 2.1 anti_content 入口定位 >1 找到需加密參數 >2 全局搜索定位 這里只出來一個結果,很明顯,點進去。 …

限流系列之五:TDMQ RabbitMQ Serverless 版限流機制深度解析與實踐指南

導語 分布式集群限流是保障云服務高可用性的核心技術手段,其意義不僅在于防止系統過載,更是構建彈性架構、優化資源效率、實現業務可持續性的關鍵策略。未來,隨著邊緣計算和 Serverless 的普及,限流技術將進一步與底層基礎設施深…

官方鏈接內容整理的 Spark-TTS Windows 安裝完整流程

官方鏈接內容整理的 Spark-TTS Windows 語音克隆 安裝完整流程 官方鏈接內容整理的 Spark-TTS Windows 安裝完整流程: Spark TTS:基于大型語言模型的文本轉語音模型 Spark-TTS 是一個先進的文本轉語音系統,利用大型語言模型(LLM…

Spring Cloud Config動態刷新實戰指南

以下是利用 Spring Cloud Config + Bus 實現配置動態刷新的完整步驟和原理說明: 一、核心原理 消息總線機制 Bus 通過消息代理(如 RabbitMQ/Kafka)建立公共 Topic(默認 springCloudBus),當配置變更時,任一服務觸發刷新請求,消息會廣播至所有監聽該 Topic 的服務實例,實…

Linux 修改密碼教程

Linux 修改密碼教程 Linux 系統中修改密碼是非常常見的管理操作,無論是修改當前用戶密碼還是其他用戶的密碼,通常都可以通過終端完成。本文將詳細介紹如何在 Linux 系統中修改密碼,并包括修改其他用戶密碼的方法。 1. 修改當前用戶密碼 修改…

正則表達式詳解:從基礎到高級應用的全面指南

文章大綱 引言:什么是正則表達式? 在編程和文本處理領域,正則表達式(Regular Expression,簡稱 regex)是一種強大的工具,用于描述和匹配文本中的特定模式。它本質上是一種由字符和特殊符號組成…

flutter結合ai工具(其他語言通用)

一、為什么Flutter開發者需要免費AI工具? 1. 減少重復性編碼 Flutter開發中,UI組件、網絡請求、狀態管理等代碼高度重復,AI可自動生成這些代碼。 示例:輸入"創建一個Material Design風格的登錄頁面",AI工具…

鴻蒙容器組件 Row 全解析:水平布局技術與多端適配指南

一、引言:Row 組件 —— 水平布局的核心引擎 在鴻蒙全場景應用開發中,Row 容器組件作為水平布局的標準載體,通過聲明式語法實現子組件的有序水平排列。作為線性布局體系的重要組成部分,其簡潔的屬性體系與強大的適配能力&#xf…

基于 PCIe 架構的處理器系統

處理器系統A 在有些處理器系統中,沒有直接提供PCI總線,此時需要使用PCIe橋,將PCIe鏈路轉換為PCI總線之后,才能連接PCI設備 在這種結構中,RC由兩個FSB-to-PCIe橋和存儲器控制器組成。 FSB是Front Side Bus的縮寫&…

Qt 與 Halcon 聯合開發五:為何與如何將耗時算法移入子線程

在 Qt 應用程序開發中,界面響應速度直接影響用戶體驗。而在集成圖像處理庫如 Halcon 的項目中,耗時算法一旦運行于主線程中,極易造成界面卡頓甚至假死。本篇文章將圍繞耗時算法必須移入子線程執行這一核心原則,結合 Qt 與 Halcon …

聚焦OpenVINO與OpenCV顏色通道轉換的實踐指南

顏色通道順序問題:OpenVINO模型RGB輸入與OpenCV BGR格式的轉換 在計算機視覺任務中,框架間的顏色通道差異常導致模型推理錯誤。以下方法解決OpenVINO模型需要RGB輸入而OpenCV默認輸出BGR的問題。 理解核心差異 OpenCV的imread()函數遵循BGR通道順序&a…

【軟考高級系統架構論文】論企業集成平臺的理解與應用

論文真題 企業集成平臺 (Enterprise Integration Platform, EIP) 是支持企業信息集成的環境,其主要功能是為企業中的數據、系統和應用等多種對象的協同運行提供各種公共服務及運行時的支撐環境。企業集成平臺能夠根據業務模型的變化快速地進行信息系統的配置和調整,保證不同…

LabVIEW光譜儀設計

采用LabVIEW 開發平臺,搭配品牌硬件構建光譜儀系統,實現光譜數據的高效采集、分析與顯示,展現 LabVIEW 在儀器開發中的快速集成與靈活擴展能力。 ? 應用場景 科研領域:用于材料光譜特性研究、光學實驗數據分析,支持高…

Nginx配置文件介紹和基本使用

Nginx配置文件介紹和基本使用 Nginx 是一款高性能的 HTTP 服務器、反向代理服務器及電子郵件代理服務器,由俄羅斯工程師 Igor Sysoev 開發,并于2004年首次公開發布。以輕量級、高并發能力、穩定性和低資源消耗著稱。 主要功能 HTTP服務器:…

DataSophon 1.2.1集成Flink 1.20并增加JMX 監控

參考:datasophon集成Flink1.20.0 此大神有多篇集成其他服務的文章,建議關注一波 一、服務集成 flink 1.20 下載 1.構建壓縮包: 1.1拷貝需要的包 tar -zxvf flink-1.20.0-bin-scala_2.12.tgz tar czf flink-1.20.0.tar.gz flink-1.20.0# 為了flink cdc…

RSYNC+IONTIFY數據實時同步

一、RSYNC簡介 rsync是linux系統下的數據鏡像備份工具。使用快速增量備份工具Remote Sync可以遠程同步,支持本地復制,或者與其他SSH、rsync主機同步。 二、rsync特性 rsync支持很多特性: 可以鏡像保存整個目錄樹和文件系統可以很容易做到保持…

吉林大學軟件工程期末復習整理

概述 22級軟件工程考試細節及復習相關問題見下面這篇帖子,作者自己復刻了一版真題 吉林大學軟件工程2025年期末真題(回憶復刻版)-CSDN博客 下面是作者復習時整理的筆記,放到csdn之后序號排版稍微有點亂 21級考試情況可以參考學…

chili3d筆記23 正交投影3d重建筆記4 點到線2

從俯視圖到主視圖就這兩條線有問題,比想象的效果好 原圖 兩條斜線變成了4條橫線 經典少一根線 好了但是不知道為什么好了 import { Logger, PubSub } from "chili-core"; import DxfParser, { ILineEntity } from dxf-parser; class Cluster {lines: [num…

LDO的自放電功能

LDO(低壓差線性穩壓器)的自放電功能(Discharge Function 或 Active Discharge)是一種在關閉輸出時主動釋放輸出端殘留電荷的機制。以下是其關鍵點: 1. 自放電功能的作用 快速放電:當LDO被禁用(如…