【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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被禁用(如…