- 博客(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
原创 【大白话说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与工具调用
2026-06-07
04-并发篇 大白话说Java面试题(【Java并发编程】基于volatile与synchronized的线程安全机制及锁优化策略解析)
2026-06-07
Linux下Python 3.13.0源码编译安装指南(CentOSRHEL)
2026-06-05
03-Mysql篇 大白话说Java面试题
2026-05-23
02-JVM篇 大白话说Java面试题
2025-10-29
01-Java基础篇 大白话说Java面试题
2025-10-29
Java开发基于Spring Boot的异常处理框架设计:电商系统业务异常建模与全局统一响应实现
2026-04-19
【微服务架构】基于Spring Cloud Alibaba的分布式事务处理:Seata AT模式与Sentinel协同实现高并发下数据最终一致性
2026-04-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅