自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(148)
  • 收藏
  • 关注

原创 【大白话说Java面试题 第107题】【并发篇】第7题:说说 Lock 锁?

本文摘要: Lock锁是JUC包的核心接口,与synchronized相比提供了更精细的并发控制能力。文章深入解析了Lock接口的核心方法,重点剖析了ReentrantLock基于AQS框架的实现原理,包括非公平锁和公平锁的获取流程差异。详细对比了公平锁与非公平锁在性能、饥饿风险等方面的区别,并介绍了Condition条件队列相比Object wait/notify的优势。全文从API层到AQS框架层再到CAS+队列层,系统性地阐述了Lock锁的完整架构设计,为开发者正确选择和使用锁机制提供了理论依据。

2026-06-10 21:11:24 126

原创 【大白话说Java面试题 第106题】【并发篇】第6题:synchronized 锁的锁对象可以是什么?

摘要: 本文深入解析Java中synchronized锁的锁对象选择与陷阱,涵盖静态方法(类锁)、实例方法(对象锁)和同步代码块(自定义锁)的实现原理及字节码差异。重点强调五大锁对象选择原则:不可变性、私有性、避免可变对象、防止外部访问冲突、细粒度锁优化,并揭露String常量池复用、Integer缓存、this锁共享等典型陷阱。通过对比错误与正确代码,提供工程实践方案,帮助开发者规避死锁与性能问题,实现高效并发控制。

2026-06-10 21:08:39 334

原创 【大白话说Java面试题 第105题】【并发篇】第5题:说一下 synchronized 关键字的底层原理?

摘要: synchronized关键字的底层原理涉及字节码指令、Monitor对象模型和锁升级机制。字节码层面,同步代码块通过monitorenter/monitorexit指令实现,编译器自动生成异常处理确保锁释放;同步方法则通过ACC_SYNCHRONIZED标志隐式加锁。HotSpot虚拟机中,重量级锁的核心是ObjectMonitor对象,包含锁持有者(_owner)、重入计数(_recursions)、竞争队列(_cxq,LIFO)、入口队列(_EntryList,FIFO)等关键字段。锁获取流程

2026-06-09 21:21:06 369

原创 【大白话说Java面试题 第104题】【并发篇】第4题:说一下 synchronized 关键字的作用?

摘要: synchronized是Java实现线程同步的核心关键字,通过Monitor对象模型和对象头Mark Word实现锁机制。JDK 6后引入锁升级(无锁→偏向锁→轻量级锁→重量级锁)和优化策略(偏向锁、锁消除、锁粗化等),大幅提升性能。其特性包括: 原子性(互斥访问)、可见性(内存屏障)、有序性(单线程串行执行); 底层依赖monitorenter/monitorexit指令,对象头存储锁状态; 锁升级过程减少竞争开销,但JDK 15后偏向锁默认禁用。 与ReentrantLock相比,synchr

2026-06-09 21:19:53 344

原创 【大白话说Java面试题 第103题】【并发篇】第3题:为什么 volatile 能够保证可见性?底层原理是什么?

摘要: volatile 通过 JMM 内存模型与硬件协同实现可见性。JMM 规定 volatile 变量的读写必须立即同步到主内存,并通过 lock 前缀指令触发 CPU 的缓存一致性协议(如 MESI),强制其他核心的缓存失效。底层机制涉及:1)lock 指令锁定缓存行并刷新主存;2)MESI 协议维护多核缓存状态(Modified/Exclusive/Shared/Invalid);3)内存屏障(如 StoreLoad)解决 Store Buffer 和 Invalidate Queue 引入的延迟问

2026-06-08 21:05:34 409

原创 【大白话说Java面试题 第102题】【并发篇】第2题:volatile 能否保证线程安全?

摘要: volatile 无法完全保证线程安全,因其仅解决可见性和有序性,但无法保证原子性(如 i++ 的复合操作)。通过指令级拆解可见,多线程并发执行 count++ 会导致竞态条件和写丢失。仅在一写多读、单次赋值等特定场景下,volatile 可独立保证安全。实际开发中,需根据场景选择: synchronized(悲观锁)强制互斥,但性能较低; ReentrantLock(显式锁)更灵活; CAS/原子类(如 AtomicInteger)无锁实现高效原子操作; ThreadLocal 线程隔离避免竞争。

2026-06-08 20:50:33 455

原创 【大白话说Java面试题 第101题】【并发篇】第1题:说一下 volatile 关键字的作用?

文章摘要(149字): volatile是Java并发编程的关键字,通过缓存一致性协议和内存屏障确保变量的可见性(线程修改后立即可见)和有序性(禁止指令重排序),但不保证复合操作的原子性(如i++)。其底层依赖JMM内存模型、lock前缀指令及MESI协议,强制主内存与线程工作内存同步。典型应用包括状态标志、DCL单例模式,但需注意与synchronized的边界——volatile仅解决共享变量的可见性与有序性问题,互斥性仍需锁机制保障。

2026-06-07 11:03:09 522

原创 【大白话说Java面试题 第100题】【Mysql篇】第30题:事务的隔离级别有哪些?MySQL 的默认隔离级别是什么?

摘要: MySQL事务隔离级别包括读未提交(RU)、读已提交(RC)、可重复读(RR)和串行化(Serializable),默认级别为RR。核心差异在于MVCC机制下ReadView的生成时机:RC每次SELECT生成新ReadView,可能导致不可重复读;RR事务内复用同一ReadView,解决不可重复读但需通过Next-Key Lock(记录锁+间隙锁)防止幻读。MVCC通过隐藏字段(DB_TRX_ID、DB_ROLL_PTR)和版本链实现读写分离,ReadView依据事务ID判断数据可见性。实际应用中

2026-06-07 10:29:34 414

原创 【大白话说Java面试题 第99题】【Mysql篇】第29题:如何选择合适的分布式主键方案?

摘要: 分布式主键方案选型需综合考虑全局唯一性、趋势递增性、性能和可用性等核心指标。常见方案包括: UUID:无序且存储开销大,仅适用于临时场景,禁止作为数据库主键。 数据库号段模式:通过预分配ID段提升性能,但存在数据库单点瓶颈,适合严格递增场景(如订单号)。 Snowflake算法:高性能且趋势递增,但需解决时钟回拨和Worker ID分配问题,原生版本不建议直接生产使用。 优化方案(如Leaf、UidGenerator):结合号段预加载或环形缓存等机制,平衡性能与可靠性,适合高并发场景(如电商、支付系

2026-06-06 11:13:21 522

原创 【大白话说Java面试题 第98题】【Mysql篇】第28题:LIMIT 1000000 加载很慢的话,你是怎么解决的呢?

MySQL深分页(如LIMIT 1000000)性能问题的核心在于大量无效扫描和回表操作。优化方案包括: 主键范围查询:利用WHERE id > last_id直接定位,避免扫描偏移量之前的记录。 游标分页:记录上一页末尾的主键值作为下一页起点,适合连续翻页场景。 延迟关联:子查询先通过覆盖索引获取目标ID,再关联回表,减少回表次数。 覆盖索引:建立包含查询字段的联合索引,避免回表。 结果缓存:高频访问数据可缓存至Redis等。 这些方案分别适用于不同场景,需结合业务需求选择,核心目标是减少无效扫描和回表操

2026-06-06 10:53:59 402

原创 【大白话说Java面试题 第97题】【Mysql篇】第27题:说说分库与分表的设计?

文章摘要: 分库分表是解决数据库性能瓶颈的终极方案,适用于单库单表数据量过大或并发量过高的场景。核心策略包括水平分库分表和垂直分库分表,常见分片方式有范围分片、哈希分片和一致性哈希。分片键的选择至关重要,需满足高频查询、数据均匀、不可变等原则。实施分库分表会带来分布式ID、跨库事务、关联查询等挑战,可通过雪花算法、Seata框架、字段冗余等方式解决。主流中间件如ShardingSphere提供完整解决方案。设计流程需依次评估需求、选择策略、确定分片键并规划容量扩容方案。

2026-06-05 21:30:01 538

原创 【大白话说Java面试题 第96题】【Mysql篇】第26题:日常工作中你是怎么优化 SQL 的?

摘要:本文系统介绍了SQL优化流程,包括定位慢查询(开启日志、分析工具)、EXPLAIN执行计划分析(重点关注type/key/rows等字段)、常见优化手段(索引优化、查询改写、表结构调整)及实战案例。核心方法论是通过"定位→分析→优化→验证"闭环,结合索引设计、语句重构等技术显著提升查询性能,同时强调监控验证的重要性。

2026-06-05 21:27:07 266

原创 【大白话说Java面试题 第95题】【Mysql篇】第25题:MySQL 遇到过死锁问题吗?你是如何解决的?

本文介绍了MySQL死锁的核心概念、常见场景、定位方法和解决方案。死锁是指事务间因循环等待锁而无法继续执行的现象,需满足互斥、持有等待、不可剥夺和循环等待四个条件。InnoDB通过自动检测和回滚机制处理死锁。常见死锁场景包括交叉加锁、间隙锁冲突、不同索引加锁顺序不一致等。定位死锁可通过查看SHOW ENGINE INNODB STATUS日志或使用监控工具。解决方案包括固定加锁顺序、缩小事务范围、降低隔离级别、使用唯一索引以及应用层重试机制。

2026-06-04 22:16:51 626

原创 【大白话说Java面试题 第94题】【Mysql篇】第24题:什么是单路排序?什么是双路排序??

摘要:MySQL的filesort操作包含单路排序(Single-pass)和双路排序(Two-pass)两种策略。单路排序将查询的所有字段加载到内存排序缓冲区,减少磁盘I/O但内存占用高;双路排序仅加载排序字段和主键,排序后回表查询其他字段,适合大数据集但增加回表开销。MySQL根据max_length_for_sort_data参数和sort_buffer_size自动选择策略。优化建议包括使用索引排序、减少查询字段、调整缓冲区大小及监控排序性能。面试需掌握原理、适用场景及优化方法,例如避免fileso

2026-06-04 22:15:44 331

原创 【大白话说Java面试题 第93题】【Mysql篇】第23题:从查找速度来看,聚集索引和非聚集索引哪个更快?

文章摘要: MySQL索引性能对比中,聚簇索引通常更快,但需分场景讨论: 主键等值/范围查询:聚簇索引最优(1次B+树查找,顺序I/O)。 需回表的二级索引:速度较慢(2次查找+随机I/O)。 覆盖索引:非聚簇索引可能反超(索引树更小,内存效率高)。 特殊场景如MyISAM因堆表结构导致主键查询需二次I/O,而InnoDB聚簇索引直接定位数据。优化建议:高频查询用聚簇索引,覆盖索引优化特定查询,联合索引适配业务场景。 (摘要字数:149字)

2026-06-03 20:38:01 308

原创 【大白话说Java面试题 第92题】【Mysql篇】第22题:你刚刚提到的一致性 Hash 算法能描述下么?

摘要: 一致性哈希算法用于解决分布式系统数据迁移问题,相比传统取模哈希,其核心思想是将哈希空间组织成环形结构,并通过虚拟节点实现数据均衡分布。 关键点: 传统取模问题:节点增减导致大量数据迁移(如3→4节点,75%数据需迁移)。 一致性哈希原理: 环形空间:数据按哈希值顺时针定位到最近节点。 虚拟节点:每个物理节点对应多个虚拟节点(如150个),解决数据倾斜。 优势:节点变化仅影响局部数据(迁移量≈1/N),适用于分布式缓存、数据库分片等场景。 实现:通过TreeMap维护哈希环,支持动态节点增删。 对比:

2026-06-03 20:36:55 438

原创 【大白话说Java面试题 第91题】【Mysql篇】第21题:分布式锁的使用场景和原理?

**摘要:分布式锁用于协调分布式系统中多节点对共享资源的互斥访问,核心特性包括互斥性、可重入性、高可用性和防死锁。常见使用场景包括库存扣减、定时任务调度、缓存击穿防护等。Redis实现方案通常基于SETNX命令,需解决锁误释放、过期续期等问题,Redlock算法可提升可靠性但复杂度较高。ZooKeeper通过临时有序节点实现分布式锁,天然避免死锁但需处理"羊群效应"。技术选型需权衡性能、一致性和实现复杂度,多数场景下Redis单节点+看门狗机制已足够。

2026-06-02 20:24:33 596

原创 【大白话说Java面试题 第90题】【Mysql篇】第20题:如果不想使用消息队列,怎么增加 MySQL 的性能提升?

摘要: 在不使用消息队列的情况下,可通过多维度优化提升MySQL性能: 数据库设计:权衡规范化与反规范化,采用分区表(如按时间范围)或表拆分(垂直/水平)降低单表压力; 索引优化:遵循高区分度、覆盖索引原则,避免索引失效,通过覆盖索引+JOIN优化深分页查询(减少回表); 查询优化:避免SELECT *,使用批量操作替代单条处理,优化分页(如记录上次ID或子查询); 配置调优:调整InnoDB缓冲池大小、日志刷盘策略(如innodb_buffer_pool_size设为内存70-80%),平衡性能与一致性;

2026-06-02 20:23:27 311

原创 【大白话说Java面试题 第89题】【Mysql篇】第19题:Hash 索引和 B+ 树索引的区别?它们在使用方面的区别?

摘要: Hash索引和B+树索引的核心区别在于底层数据结构和适用场景。Hash索引基于哈希表,等值查询效率高(O(1)),但不支持范围查询、排序和模糊查询,且存在哈希冲突问题;B+树索引为平衡多叉树,支持高效的范围查询(O(logₘ n))和排序,天然有序,适合磁盘存储。 关键点: Hash索引:仅适用于等值查询(如MEMORY引擎),内存场景性能优,但无法支持数据库常见操作(如范围查询)。 B+树索引:通用性强,InnoDB默认采用,支持复杂查询和排序,通过自适应哈希索引(AHI)优化热点数据访问。 选择

2026-06-01 22:06:51 342

原创 【大白话说Java面试题 第88题】【Mysql篇】第18题:a 和 b 是联合索引,SELECT * FROM table WHERE a > 1 AND b = 2 是否可以使用到索引?

不能索引查找,但MySQL 5.6+可通过ICP在索引层过滤,减少回表;的记录分散在(2,?)、(3,2)、(4,2)等位置,无法一次性定位。需要回表,即使有ICP,回表次数仍等于满足条件的行数。,因为大量回表随机I/O成本可能高于全表顺序扫描。:回表次数从1000次降到10次,性能提升。几乎无法被覆盖(除非全表字段都在索引中)。:如果查询是覆盖索引,ICP可能不再显示。,您的关注是我创作的最大动力~ 🎯。:覆盖索引要求索引包含查询所需的。,因为根本不需要回表。觉得对您有帮助,麻烦。

2026-06-01 22:05:30 340

原创 API接口测试-请忽略

这是一篇通过API自动发布的测试草稿,稍后会删除。

2026-05-31 11:04:31 177

原创 【大白话说Java面试题 第87题】【Mysql篇】第17题:分布式事务的实现原理?

分布式事务实现原理及方案对比 摘要:本文系统解析了分布式事务的核心挑战与主流解决方案。刚性事务如2PC/XA协议提供强一致性,但存在阻塞和单点故障问题;柔性事务(TCC、SAGA、消息最终一致性)基于BASE理论,通过业务补偿实现最终一致性。TCC需处理幂等性、空回滚等难题,适合高并发场景;SAGA适合长流程业务;消息队列方案则侧重异步解耦。Seata框架整合多种模式,其中AT模式通过全局锁和undo日志实现低侵入方案。技术选型需权衡一致性、性能与业务复杂度。(149字)

2026-05-31 10:56:15 320

原创 【大白话说Java面试题 第86题】【Mysql篇】第16题:MySQL 中锁的种类与行锁实现原理?

MySQL锁机制与实现原理摘要 MySQL锁体系分为乐观锁(应用层实现)与悲观锁(数据库内置),按粒度可分为表锁、页锁和行锁。InnoDB核心行锁包括: 记录锁(锁定索引项); 间隙锁(RR隔离级别防幻读,锁索引间隙); Next-Key Lock(记录锁+间隙锁组合,默认行锁算法); 插入意向锁(提高间隙插入并发)。 关键特性: 行锁通过索引实现,无索引退化为全表锁; 意向锁(IS/IX)为表级辅助锁,加速表锁冲突检测; RR隔离级别通过Next-Key Lock解决幻读问题; 锁兼容性遵循两阶段锁协议(

2026-05-31 10:54:18 349

原创 【大白话说Java面试题 第85题】【Mysql篇】第15题:MySQL 的事务中,幻读是怎么解决的?

**摘要:MySQL事务中的幻读问题指同一事务内相同查询条件在不同时间点返回的行数不一致。InnoDB在RR(可重复读)隔离级别下通过两种机制解决幻读:1)MVCC(多版本并发控制)处理快照读,通过ReadView和Undo日志保证事务内读取数据的一致性;2)Next-Key Lock(记录锁+间隙锁)处理当前读,锁定索引记录及间隙防止其他事务插入。虽然MVCC和Next-Key Lock能有效防止幻读,但不同查询类型(快照读与当前读切换)可能导致结果差异,这并不违反RR级别的幻读防护标准。其他隔离级别如R

2026-05-30 10:49:02 323

原创 【大白话说Java面试题 第84题】【Mysql篇】第14题:为什么用 InnoDB 存储引擎的表建议用整型的自增主键?

摘要: InnoDB存储引擎推荐使用整型自增主键,核心原因基于性能与存储效率: 整型优势:CPU指令级高效比较(vs字符串逐字节对比);占用空间小(INT 4字节/BIGINT 8字节,远小于UUID的36字节),二级索引存储主键副本时空间放大效应显著。 自增优势:保证数据顺序插入B+树最右侧,减少页分裂(随机插入如UUID可能引发50%的页分裂,导致性能下降10-50倍),提升磁盘顺序I/O和缓存命中率。 分布式场景替代方案:Snowflake等8字节有序ID兼顾全局唯一与性能,避免UUID的存储和分裂问

2026-05-30 10:47:31 415

原创 【大白话说Java面试题 第83题】【Mysql篇】第13题:为什么 MySQL 索引底层不用红黑树?

MySQL索引不使用红黑树的主要原因在于其二叉结构不适合磁盘存储场景。红黑树作为二叉树,树高较高(千万数据约24层),导致查询需要多次磁盘I/O;其节点存储单个键值无法充分利用磁盘预读特性(16KB页大小),造成资源浪费;且范围查询效率低下。相比之下,B+树的多叉结构(默认约1170个分支)能将千万数据的树高控制在3-4层,大幅减少I/O次数,节点存储密集键值匹配磁盘页大小,并通过叶子节点链表优化范围查询。虽然红黑树在内存中表现优异(如Java的TreeMap),但数据库索引的核心矛盾是磁盘I/O效率,这正

2026-05-29 21:25:41 291

原创 【大白话说Java面试题 第82题】【Mysql篇】第12题:为什么 MySQL 索引底层不用二叉树?

MySQL索引不采用二叉树(包括平衡二叉树)的主要原因有三:一、普通二叉搜索树在有序插入时会退化为链表,性能降至O(n);二、即使使用AVL/红黑树保持平衡,二叉树结构每个节点仅2个子节点,导致树高过大(1000万数据约24层),磁盘I/O次数过多;三、B+树通过多叉结构(每个节点约1170个键值)将树高压至3-4层,大幅减少I/O次数,并利用叶子节点链表支持高效范围查询。核心在于磁盘I/O是数据库性能瓶颈,B+树设计专门针对优化,而二叉树结构无法满足要求。

2026-05-29 21:24:27 326

原创 【大白话说Java面试题 第81题】【Mysql篇】第11题:Explain 执行计划怎么看?

MySQL执行计划优化指南摘要 使用EXPLAIN分析SQL性能时,重点关注以下核心字段: type:访问类型,性能排序为system > const > ref > range > ALL,至少需达到range级别。 key:实际使用的索引,若为NULL需优化索引设计。 rows:扫描行数,越小越好。 Extra:避免Using filesort(额外排序)和Using temporary(临时表),优先出现Using index(覆盖索引)。 优化建议: 联合索引需遵循最左前缀原则,范围查询后索引失效。

2026-05-28 20:24:38 244

原创 【大白话说Java面试题 第80题】【Mysql篇】第10题:MySQL 在什么条件下索引失效?

摘要: MySQL索引失效的核心在于优化器决定不使用索引,分为无法利用索引有序性和优化器主动放弃索引两类。常见失效场景包括:不遵循最左前缀原则、LIKE前导通配符、对索引列使用函数或隐式类型转换、范围查询后列失效等。优化器可能因数据量小、区分度低或统计信息不准确选择全表扫描。通过EXPLAIN分析type、key等字段可判断索引是否生效。解决方案包括调整查询条件、优化索引设计或强制使用索引(如FORCE INDEX)。理解底层原理(如B+树结构、优化器成本估算)是面试加分项。 (字数:150)

2026-05-28 20:23:06 200

原创 【大白话说Java面试题 第79题】【Mysql篇】第9题:说一下什么是索引下推?

**索引下推(ICP)**是MySQL 5.6引入的优化技术,将WHERE条件中部分索引列的过滤从Server层下推到存储引擎层执行,在索引扫描过程中提前过滤,从而减少回表次数。核心原理是存储引擎在扫描索引时直接判断可下推的条件,只有满足条件的记录才回表查询完整数据。 ICP生效需要满足:使用二级索引、WHERE条件包含索引列、存在可下推的剩余条件。典型场景包括联合索引跳过中间列、范围查询后的列过滤等。通过EXPLAIN的Using index condition可验证ICP是否生效。 相比覆盖索引(避免回

2026-05-27 20:43:31 482

原创 【大白话说Java面试题 第78题】【Mysql篇】第8题:解释下最左前缀原则?

摘要: 最左前缀原则是MySQL联合索引的核心机制,要求查询必须从索引最左列开始匹配。联合索引(a, b, c)本质是按a、(a, b)、(a, b, c)三级排序的B+树结构,跳过最左列将导致索引失效。范围查询(如>)会使后续列索引失效,而等值查询可延续使用。通过索引下推(ICP),即使跳过中间列(如WHERE a=1 AND c=3),也能在索引层过滤数据。设计联合索引时,应优先将高区分度、等值查询列放在左侧,范围查询和排序字段置于末尾。合理运用该原则可显著提升查询效率,避免全表扫描。

2026-05-27 20:42:09 480

原创 【大白话说Java面试题 第77题】【Mysql篇】第7题:回表查询与全表扫描的区别?

回表查询与全表扫描的核心区别在于数据访问方式:回表查询通过二级索引找到主键后,需二次访问聚簇索引获取完整数据(2次B+树查找,含随机I/O),适合少量数据查询;全表扫描直接顺序读取聚簇索引叶子节点(1次顺序I/O),适合大数据量或低选择性查询。优化器基于成本模型选择执行计划,当回表随机I/O成本高于全表扫描时(如数据占比>20%),可能放弃索引。可通过覆盖索引、索引下推或延迟关联优化回表查询,关键指标可通过EXPLAIN分析type和Extra字段判断。

2026-05-26 20:40:03 909

原创 【大白话说Java面试题 第76题】【Mysql篇】第6题:谈谈你对 Hash 索引的理解

摘要: Hash索引基于哈希表实现,通过哈希函数快速定位数据,理想时间复杂度为O(1),但存在哈希冲突问题。MySQL中仅MEMORY引擎显式支持Hash索引,InnoDB不支持手动创建,但提供自适应哈希索引(AHI)自动优化热点查询。与B+Tree索引相比,Hash索引仅适合等值查询,不支持范围查询、排序或联合索引最左前缀。实际场景中,B+Tree索引更通用,而Hash索引适用于内存临时表或特定等值查询优化。MySQL 8.0的Hash Join是独立优化技术,用于加速无索引的等值连接查询。

2026-05-26 20:36:27 435

原创 【大白话说Java面试题 第75题】【Mysql篇】第5题:MySQL 的聚簇索引和非聚簇索引的区别是什么?

MySQL聚簇索引与非聚簇索引的核心区别在于数据存储方式:聚簇索引的叶子节点直接存储完整行数据(如InnoDB主键索引),而非聚簇索引仅存储指向数据的指针(如InnoDB二级索引存主键值,MyISAM索引存行偏移量)。关键差异包括: 聚簇索引决定数据的物理排序,每表仅有一个; 非聚簇索引独立于数据存储,可存在多个; InnoDB二级索引需通过主键值回表查询,而MyISAM直接使用指针; 覆盖索引能避免回表,显著提升查询性能; 主键选择(如自增ID vs UUID)会直接影响聚簇索引的写入效率和空间占用。

2026-05-25 22:33:11 636

原创 【大白话说Java面试题 第74题】【Mysql篇】第4题:InnoDB 和 MyISAM 的数据文件存储区别?

摘要: InnoDB与MyISAM的核心区别在于数据存储方式与索引结构。InnoDB采用聚簇索引,数据与主键索引共存于.ibd文件,支持事务、行锁及崩溃恢复;MyISAM则分离数据(.MYD)与索引(.MYI),仅支持表锁且无事务能力。InnoDB的二级索引需回表查询,而MyISAM所有索引均存储数据文件指针。MySQL 8.0已默认仅支持InnoDB,因其在并发、可靠性和性能上全面超越MyISAM,后者仅适用于极少数只读场景。生产环境强烈推荐InnoDB。

2026-05-25 22:30:27 471

原创 【大白话说Java面试题 第73题】【Mysql篇】第3题:说说索引的设计原则?

索引设计原则摘要 索引设计的核心是在查询效率和写入成本间取得平衡。六大原则包括:1)为高频查询字段建索引;2)优先高区分度字段;3)长字段使用前缀索引;4)更新频繁字段慎建索引;5)联合索引遵循最左前缀原则;6)利用覆盖索引避免回表。实际应用中需结合查询模式、数据分布和写入频率综合判断,例如电商订单表可建立(user_id,create_time)联合索引优化用户查询,对低区分度status字段需评估数据分布再决定是否索引。同时要注意索引命名规范和避免过度索引带来的存储与维护成本。

2026-05-24 10:58:21 481

原创 【大白话说Java面试题 第72题】【Mysql篇】第2题:为什么 MySQL 索引底层用 B+ 树不用 B 树?

MySQL选择B+树而非B树作为索引底层结构,主要基于三个核心优势:1)B+树非叶子节点仅存储键值和指针,使树高更低,10亿数据仅需3-4次I/O;2)叶子节点双向链表支持高效范围查询,性能远超B树的中序遍历;3)查询路径固定,性能更稳定。虽然B树在等值查询上略有优势,但关系型数据库更依赖范围查询操作,且B+树的全表扫描和覆盖索引优化更优。此外,B+树的页分裂机制也使其更适合高并发写入场景。

2026-05-24 10:55:04 382

原创 【大白话说Java面试题 第71题】【Mysql篇】第1题:索引是什么?

本文系统讲解了MySQL索引的核心知识点,包括索引的本质(B+Tree数据结构)、工作原理、类型特点及优缺点。重点分析了联合索引的最左前缀原则、回表与覆盖索引机制,列举了索引失效的典型场景。文章还提供了面试常见追问的解答思路,并对比了有无索引的性能差异。最后总结出索引使用的最佳实践:优先考虑查询性能,同时兼顾写入成本和存储空间,强调索引不是越多越好,需根据实际业务场景合理设计。全文以通俗易懂的方式呈现,适合面试准备和日常学习参考。

2026-05-23 11:43:47 531

原创 【大白话说Java面试题 第70题】【JVM篇】第30题:垃圾回收器是怎样寻找 GC Roots 的?

摘要: 垃圾回收器通过STW(Stop-The-World)机制确保引用一致性,利用OopMap快速定位GC Roots(线程栈、静态变量、JNI引用等)。HotSpot优化包括安全点暂停线程、安全区域处理阻塞线程,不同收集器(如CMS/G1)在初始标记阶段统一枚举根,并发阶段处理差异。核心挑战是平衡准确性与效率,现代GC通过并行扫描和OopMap缩短停顿时间。面试需掌握根枚举流程、三色标记关联及并发收集器的优化策略。

2026-05-23 10:37:21 500

原创 【大白话说Java面试题 第69题】【JVM篇】第29题:GC Roots 有哪些?

本文详细介绍了Java垃圾回收中的GC Roots概念,包括其5种主要类型(虚拟机栈引用、静态属性引用、常量引用、JNI引用和活跃线程)及其具体示例。文章还分析了各类型GC Roots的生命周期和常见内存泄漏风险,并解答了面试中可能追问的问题。最后提供了使用MAT工具查看对象GC Root引用的方法,并总结了GC Roots的关键知识点,帮助开发者深入理解可达性分析算法和内存泄漏排查技巧。

2026-05-22 20:51:21 525

【人工智能开发】基于Spring AI的智能对话系统设计:Java全栈实现RAG与工具调用

内容概要:本文是一份基于Spring AI 1.0.x与Spring Boot 3.x的智能对话系统项目实战教程,系统讲解了如何使用Spring AI构建具备企业级特性的AI应用。内容涵盖项目初始化、基础对话、对话记忆、系统提示词管理、结构化输出、工具调用(Tool Calling)、检索增强生成(RAG)、MCP协议、可观测性与生产部署等核心功能,并通过完整项目整合所有知识点,帮助开发者掌握从开发到上线的全流程。 适合人群:具备Java与Spring Boot基础,熟悉基本Web开发,希望快速上手Spring AI构建AI对话系统的1-3年经验研发人员。 使用场景及目标:①构建具备上下文记忆、工具调用和知识库问答能力的智能客服或助手;②深入理解Spring AI的ChatClient、Advisor机制、RAG实现与MCP协议集成;③实现生产级AI应用的可观测性、安全配置与性能优化。 阅读建议:此资源以项目驱动方式讲解,建议读者边学边练,结合代码实践并调试运行,重点关注配置细节与各功能模块的集成方式,同时注意API版本兼容性问题。

2026-06-07

04-并发篇 大白话说Java面试题(【Java并发编程】基于volatile与synchronized的线程安全机制及锁优化策略解析)

内容概要:本文档围绕Java并发编程中的核心知识点展开,系统讲解了volatile关键字、synchronized机制、Lock锁、CAS无锁算法、AQS框架、线程状态与控制、线程池配置及常用并发工具类等内容。重点剖析了volatile的可见性与有序性实现原理、synchronized的monitor锁机制、ReentrantLock与AQS的关系、CAS的原子性保障及其三大问题(自旋、ABA、单变量)、线程间协作方式(join、CountDownLatch、条件队列)以及ConcurrentLinkedQueue的无锁队列设计等。; 适合人群:具备一定Java基础,从事Java开发1-3年,正在准备Java后端或并发相关面试的中级研发人员。; 使用场景及目标:①深入理解Java多线程核心机制,掌握常见并发问题的解决方案;②应对中高级Java岗位面试中的并发编程考察,提升对锁机制、线程安全、原子类等知识的系统性认知;③为实际项目中高并发场景的设计与优化提供理论支持。; 阅读建议:建议结合JVM内存模型和操作系统原理进行理解,重点掌握各机制的底层实现差异(如volatile与synchronized的内存屏障异同),并通过编码实践验证理论知识点,强化记忆与应用能力。

2026-06-07

Linux下Python 3.13.0源码编译安装指南(CentOSRHEL)

内容概要:本文详细介绍了在CentOS/RHEL系列操作系统(包括CentOS 7/8/9、RHEL 7/8/9、AlmaLinux、Rocky Linux)上通过源码编译方式安装Python 3.13.0的完整流程。重点涵盖环境准备、依赖安装(特别是CentOS 7下的OpenSSL兼容性处理)、源码下载与验证、编译配置(包括启用PGO/LTO优化、自由线程模式及实验性JIT编译器等高级选项)、安全安装(使用altinstall避免覆盖系统Python)、安装后配置(如pip升级、镜像源设置、虚拟环境使用)以及常见问题排查和卸载方法。文章强调了在企业级Linux系统中安全、独立地部署新版Python的最佳实践。; 适合人群:Linux系统管理员、DevOps工程师、Python开发人员,尤其是需要在CentOS/RHEL环境下部署最新Python版本并具备一定Linux操作基础的技术人员。; 使用场景及目标:① 在不破坏系统默认Python环境的前提下安装Python 3.13;② 体验Python 3.13的自由线程模式(No-GIL)和JIT编译器等实验性特性;③ 解决CentOS 7等老旧系统因OpenSSL版本过低导致的编译难题;④ 构建高性能、功能完整的Python运行环境用于开发、测试或生产部署。; 阅读建议:建议读者按照文档顺序逐步操作,特别注意CentOS 7的OpenSSL处理和始终使用`make altinstall`的安全原则。在启用实验性功能(如No-GIL、JIT)时应充分评估其稳定性风险。可结合文末提供的一键安装脚本提高效率,但需理解每一步的作用以便应对实际环境差异。

2026-06-05

03-Mysql篇 大白话说Java面试题

内容概要:本文系统讲解了MySQL数据库的核心知识点,重点围绕索引机制、存储引擎差异、事务处理、锁机制及SQL优化等方面展开。深入剖析了B+树作为索引底层结构的优势,对比了聚簇索引与非聚簇索引的存储差异,并阐述了InnoDB如何通过MVCC和Next-Key Lock解决不可重复读与幻读问题。同时涵盖了索引设计原则、最左前缀原则、索引下推、执行计划分析等实用优化技巧,并探讨了分库分表、分布式事务与主键生成策略等高阶主题。; 适合人群:具备一定数据库基础,从事Java或后端开发1-3年的研发人员。; 使用场景及目标:①深入理解MySQL索引原理及查询优化方法;②掌握事务隔离级别、锁机制与并发控制策略;③应对MySQL相关技术面试,提升数据库调优能力。; 阅读建议:建议结合实际SQL语句和执行计划(EXPLAIN)进行动手验证,重点关注索引失效场景与优化方案,在真实项目中应用分页优化、覆盖索引等技巧以加深理解。

2026-05-23

02-JVM篇 大白话说Java面试题

内容概要:本文系统性地讲解了JVM的核心知识点,涵盖JVM组成、内存模型、垃圾回收机制、类加载器、GC算法与收集器、性能调优、OOM分析及常用监控工具等内容。通过问答形式深入剖析了JVM的底层原理,如双亲委派模型、可达性分析、三色标记、STW机制等,并结合生产实践介绍了G1垃圾收集器的工作流程、JVM调优参数设置以及服务器性能诊断方法。同时详细对比了不同垃圾回收算法和收集器的适用场景,帮助读者构建完整的JVM知识体系。; 适合人群:具备一定Java基础,从事Java开发1-3年以上的中初级研发人员,以及准备Java中高级岗位面试的求职者。; 使用场景及目标:①深入理解JVM内存结构与垃圾回收机制;②掌握常见JVM调优策略与参数配置;③学会使用JDK工具进行GC分析、内存泄漏排查和性能瓶颈定位;④应对大厂Java岗位面试中的JVM相关高频问题。; 阅读建议:建议结合实际项目或面试需求,按章节重点研读相关内容,对关键知识点如GC Roots、三色标记、G1收集器等需动手画图理解,并通过命令行工具模拟JVM监控与调优过程,强化实战能力。

2025-10-29

01-Java基础篇 大白话说Java面试题

内容概要:本文系统梳理了Java基础面试中的核心知识点,涵盖集合框架(ArrayList、LinkedList、HashMap、ConcurrentHashMap等)的底层原理、扩容机制、线程安全特性,深入解析了HashMap的哈希计算、冲突处理、红黑树转换条件及JDK版本演进差异;同时讲解了面向对象特性、反射、代理、异常处理、字符串类比较、深浅拷贝等关键技术点,辅以代码示例和面试官视角的追问分析,帮助读者理解设计背后的权衡与最佳实践。; 适合人群:具备一定Java编程基础,准备应对中高级Java岗位面试的研发人员,尤其是工作1-3年希望深入理解JDK源码和常见数据结构实现原理的开发者。; 使用场景及目标:①掌握Java集合类的底层实现细节,如ArrayList扩容、HashMap的put/get流程与红黑树优化;②理解并发安全机制如fail-fast/fail-safe、ConcurrentHashMap的分段锁与CAS实现;③厘清Java语言特性如反射、代理、equals与hashCode契约等高频面试问题。; 阅读建议:此资源聚焦面试实战,建议结合JDK源码进行对照学习,重点关注各数据结构的设计动机(如为何扩容1.5倍、为何树化阈值为8),并在实际编码中验证相关机制,以深化理解并提升应对深度技术提问的能力。

2025-10-29

Java开发基于Spring Boot的异常处理框架设计:电商系统业务异常建模与全局统一响应实现

内容概要:本文系统阐述了Java异常处理的核心原理与实战规范,围绕异常体系结构、处理原则、最佳实践及分层架构设计展开,重点介绍了如何通过自定义业务异常、全局异常处理器、错误码枚举和Try-With-Resources机制,构建高可用、易维护的异常处理模型。结合电商下单系统的实际案例,展示了从异常抛出、链路追踪到统一响应的完整闭环流程,涵盖日志记录、异常链保留、资源安全释放等关键环节,强调构建清晰的异常分层体系与安全的对外响应机制。; 适合人群:具备一定Java开发经验,熟悉Spring Boot框架,从事后端开发1-3年的工程师;尤其适用于参与企业级应用开发、关注系统健壮性与可维护性的技术人员;也适用于希望提升系统稳定性与代码质量的中级开发者。; 使用场景及目标:①掌握现代Java应用中异常处理的最佳实践,避免常见陷阱如吞异常、丢失堆栈、资源泄漏等;②设计统一的异常处理机制,实现业务异常与系统异常的有效分离;③在Spring Boot项目中集成全局异常处理器,提升API的规范性与安全性;④利用Try-With-Resources杜绝资源泄漏问题,确保底层资源安全释放。; 阅读建议:此文档兼具理论深度与实战价值,建议结合Spring Boot项目边学边练,重点关注GlobalExceptionHandler的实现方式、错误码枚举设计、BaseBizException定义及资源自动关闭的应用,同时严格遵循“日志记全堆栈、外网不泄密、分层抛异常”的金字塔原则,在实践中强化对异常链与资源管理的理解与应用。

2026-04-19

【微服务架构】基于Spring Cloud Alibaba的分布式事务处理:Seata AT模式与Sentinel协同实现高并发下数据最终一致性

内容概要:本文详细介绍了基于 Spring Cloud Alibaba 的分布式事务解决方案,聚焦于 Nacos、Sentinel 和 Seata 三大核心组件的协同工作。通过 Seata 的 AT 模式实现两阶段提交,保障跨服务数据强一致性,同时结合 Sentinel 实现限流、熔断与降级,防止事务悬挂与系统雪崩,并利用 Nacos 统一管理服务注册发现与动态配置。文章深入剖析了 AT 模式的执行流程、undo_log 日志机制、读写隔离问题及生产环境中的典型坑点,提供了完整的环境搭建、数据库准备、依赖配置和代码示例,适用于电商下单、资金流转等高并发强一致场景。; 适合人群:具备微服务开发经验,熟悉 Spring Boot、Spring Cloud 及分布式系统基本概念,工作年限在 2-5 年的研发工程师或架构师;尤其适合正在落地分布式事务或优化现有系统稳定性的技术人员。; 使用场景及目标:①解决微服务架构下跨数据库操作的数据一致性问题;②结合 Sentinel 提升事务链路的稳定性与容错能力;③掌握 Seata AT 模式的工作机制与生产避坑策略,构建高可用、高性能的分布式事务体系; 阅读建议:此文档强调理论与实战结合,建议读者在理解核心原理的基础上,动手搭建 Seata Server 与 Nacos 环境,逐步实现案例中的订单、库存、账户服务,并重点关注 Sentinel 熔断降级时异常传递的处理方式,避免因错误兜底导致数据不一致。

2026-04-19

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除