Java面试常问问题——Mysql篇

发布时间:2026/10/21 1:50:55

Java面试常问问题——Mysql篇 【本文章旨在帮助你快速了解Java面试中会遇到的高频面试题大部分内容来自黑马程序员的Java面试课程-视频链接以及两个很好用的面试题网站小林coding-网站链接 和JavaGuide-网站链接我将这三者进行了总结和归纳希望能帮助到你也希望你在准备面试题的时候不只是“背会了”而是“通过准备面试题拓展自己的知识面掌握技术背后的细节和逻辑”。准备面试是一个煎熬焦虑迷茫的过程多看天多想想多走走。】最高优先级必问出现频率极高索引的底层数据结构B树及优势聚簇索引 vs 非聚簇索引回表查询SQL优化如何定位和分析慢查询EXPLAIN命令事务的ACID特性及实现原理MySQL的锁机制行锁、表锁、间隙锁高优先级经常被问到索引创建原则及索引失效场景MVCC多版本并发控制原理MySQL隔离级别及解决的问题脏读、不可重复读、幻读覆盖索引及其优化作用超大分页如何处理分页优化中优先级偶尔问到MySQL三大日志binlog、undo log、redo log作用并发事务的问题及解决方案SQL优化经验字段类型、UNION ALL等主从同步原理B树和B树的区别低优先级选择性准备什么是乐观锁和悲观锁为什么可重复读不能完全解决幻读快照读 vs 当前读的区别存储引擎MyISAM和InnoDBMysql默认引擎有什么区别1.MyISAM只支持表级锁而InnoDB支持行级锁锁的粒度更细2.MyISAM不支持事务InnoDB提供事务支持并且定义了四个事务隔离级别3.InnoDB支持外键约束能够保证数据的一致性和完整性4.MyISAM不支持数据库异常崩溃后的数据恢复InnoDB通过redo log日志支持1.MySQL中如何定位慢查询MySQL本身提供了慢查询日志功能。可以在MySQL的系统配置文件中开启慢查询日志并设置SQL执行时间超过多少就记录到日志文件比如我们之前项目设置的是2秒超过这个时间的SQL就会记录在日志文件中我们就可以在那里找到执行慢的SQL。2.那这个SQL语句执行很慢如何分析呢如果一条SQL执行很慢我们通常会使用MySQL的EXPLAIN命令来分析这条SQL的执行情况。通过key和 key_len可以检查是否命中了索引如果已经添加了索引也可以判断索引是否有效。通过type字段可以判断当前SQL语句是如何查找数据的比如是否存在全索引扫描 index复合索引失效或全表扫描 all添加索引。通过extra建议可以判断是否出现回表情况如果出现可以尝试添加索引或修改返回字段来优化。3.了解索引吗索引是一种帮助MySQL高效获取数据的数据结构主要用来提高数据检索效率。4.索引的底层数据结构了解吗MySQL的默认存储引擎InnoDB索引使用的数据结构是B树。B树的非叶子节点存放键值数据的唯一标识如ID和指向子节点的指针用于导航数据的位置叶子节点存放数据并且叶子节点之间形成了一个双向链表可以进行范围查询。5.B树和B树的区别是什么呢B树的叶子节点和非叶子节点都存放数据而B树的所有数据只出现在叶子节点这使得B树在查询时效率更稳定。B树在进行范围查询时效率更高因为所有数据都在叶子节点并且叶子节点之间形成了双向链表。6.什么是聚簇索引什么是非聚簇索引二级索引聚簇索引通常只有一个一般由主键构成。数据和索引一起存储叶子节点保存了主键对应的整行数据存储的是数据本身。非聚簇索引一般都是我们自定义的索引可以有多个叶子节点存储的是聚簇索引的主键值以及我们当前索引字段的数据并不是完整数据。7.什么叫回表查询回表查询指的是此时我们先拿到二级索引存放的主键值再通过聚簇索引查询到主键值对应的数据行这个过程叫做回表查询。8.什么叫覆盖索引覆盖索引是指查询时使用了索引并且返回的列全部能在索引中找到避免了回表查询提高了性能。9.MySQL超大分页怎么处理超大分页通常发生在数据量大的情况下使用LIMIT分页查询且需要排序时效率较低。可以通过覆盖索引和子查询来解决。首先查询数据的ID字段进行分页然后根据ID列表用子查询来过滤只查询这些ID的数据因为查询ID时使用的是覆盖索引所以效率可以提升。原select * from user limit 9000000 , 10 ;优化覆盖查询子查询先查询数据的数据的 ID再根据ID找到对应的数据id是聚簇索引查询很快select * from user u ,(select id from user order by id limit 9000000,10) awhere u.ida.id;10.索引创建的原则有哪些1.表中的数据量超过10万以上时必须创建索引。2.选择查询频繁的字段作为索引如查询条件where、排序字段order by或分组字段group by。3.尽量使用覆盖索引覆盖SQL的返回值。4.控制索引的数量单张表控制在5-6个索引会让查询效率变高插入修改操作效率变低5.对于区分度较大的字段优先考虑创建索引6.如果字段区分度不高可以将其放在联合索引的后面。这样做有助于提高联合索引的效率因为在使用索引进行查询时数据库一般会优先根据联合索引前面的字段进行筛选若前面字段区分度高就能快速缩小查询范围若把区分度不高的字段放在前面可能无法有效缩小范围影响查询性能。例如在一个员工信息表中“性别” 字段区分度相对不高只有男、女两种值而 “员工编号” 区分度高每个员工编号唯一在创建联合索引时“员工编号” 应放在前面“性别” 放在后面。11.什么情况下索引会失效在使用复合索引时没有遵循最左匹配原则指的是查询从索引的最左前列开始并且不跳过索引中的列使用了复合索引但在中间使用了范围查询导致右边的条件索引失效。使用了模糊查询且%号在前面。Like %abc或者说使用了前模糊匹配。在索引字段上进行了运算操作。12.SQL优化经验有哪些建表时选择合适的字段类型。参考阿里开发手册《嵩山版》使用索引遵循创建索引的原则使用索引时避免索引失效编写高效的SQL语句比如避免使用SELECT *尽量使用UNION ALL代替UNIONUNION会多一次过滤操作效率低。union是将多个sql语句的查询结果合并采用主从复制和读写分离提高性能。13.什么是事务事务的特性?事务是逻辑上的一组操作要么都执行要么都不执行。事务的特性是ACID即原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability。例如A向B转账500元这个操作要么都成功要么都失败体现了原子性。转账过程中数据要保持一致A扣除了500元B必须增加500元。隔离性体现在A向B转账时不受其他事务干扰。持久性体现在事务提交后数据要被持久化存储。ACID靠什么保证ACID在InnoDB引擎中主要由以下机制保证原子性由undo log回滚日志保证它记录了事务回滚所需的信息。隔离性由锁机制和MVCC共同保证。锁处理写写冲突MVCC通过undo log版本链和ReadView处理读写冲突实现了无锁的快照读。持久性由redo log重做日志保证采用WAL预写日志机制确保事务提交后数据不会丢失。一致性是最终目的它其实是应用层和数据库层共同的责任。数据库通过原子性、隔离性、持久性为一致性提供了基础而应用程序必须保证正确的业务逻辑才能最终达成数据的一致性状态。比如说我们现在要进行转账操作就需要保证在应用层正确编写扣款和加款的 SQL逻辑。14.MySQL三大日志binlogundolog回滚日志redolog 重做日志1、undo log提供回滚 和 MVCC回滚日志用于记录数据被修改前的信息 。当事务回滚时undo log会通过逆操作恢复原来的数据比如我们删除一条数据的时候就会在undo log日志文件中新增一条delete语句如果发生回滚就执行相反的 Insert 语句来恢复数据保证事务的原子性.2、redo logredo log重做日志可以让mysql的数据进行故障恢复。MySQL 中数据是以页为单位每查询一条记录会从硬盘把一页的数据加载出来将数据页放入到 缓冲池 中。后续的查询都是先从 缓冲池 中找在更新数据的时候也是这样的发现 缓冲池 里存在要更新的数据就直接在 缓冲池 里更新。然后会把“在某个数据页上做了什么修改”记录到 redo log 文件里。 WAL当MySQL 重启时InnoDB 存储引擎会使用 redo log 恢复数据保证事务的持久性。15.事务的隔离性如何保证/并发事务的控制方式MVCC事务的隔离性是由锁和mvcc实现的。锁是悲观方案当一个事务执行写操作的时候会加一个排他锁解决写-写冲突。mvcc是多版本并发控制维护一个数据的多个版本不同的事务会读取自己特定版本的数据是乐观方案能够解决读-写冲突。它是MYSQL在【读已提交】和【可重复读】这两个隔离级别下实现【读操作无锁化】的核心机制。MVCC只在 读已提交 和 可重复读 两个隔离级别下工作。其他两个隔离级别和MVCC不兼容因为 读未提交 总是读取最新的数据行而不是符合当前事务版本的数据行。而 串行化则会对所有读取的行加锁。它的底层实现主要是分为了三个部分隐藏字段undo log日志和 readView读视图。隐藏字段是指在mysql中给每个表都设置了隐藏字段有一个是trx_id(事务id)记录每一次对表进行写操作的事务id另一个字段是roll_pointer(回滚指针)指向该行数据的上一个版本在 undo log 中的存储位置。undo log主要的作用是存储老版本数据会通过roll_pointer指针将数据行的历史版本形成一个链表。readView定义事务看哪个版本的数据会根据隔离级别选择对应的版本。如果是rc 读已提交隔离级别每次读取时都会生成一个新的ReadView这样就能保证当前事务总能读到其他事务已提交的最新数据如果是rr 可重复读隔离级别在事务开始时只会生成一次ReadView后续的读取都复用这个ReadView。16.MySQL主从同步原理MySQL主从复制的核心是二进制日志Binlog。步骤如下主库在收到客户端的提交事务请求后会先将事务的操作记录写入 binlog 日志再提交事务并更新本地数据。从库会读取主库的Binlog并将事务的操作记录写入中继日志Relay Log。从库重做中继日志中的事件实现主从数据一致。17.并发事务的问题MYSQL服务端是允许多个客户端连接的这意味着MYSQL会出现同时处理多个事务的情况。并发事务可能导致脏读、不可重复读和幻读。1.脏读是指一个事务读到了另一个事务未提交的“脏数据”。事务读到的数据有可能会回滚2.不可重复读是指在一个事务多次读取同一数据由于其他事务的修改导致数据不一致。3.幻读是指一个事务执行了两次相同的范围查询例如where条件第二次查询结果中满足条件的行数发生了变化比如多了一些行插入数据或少了一些行删除数据。18.怎么解决并发事务的问题MySQL默认隔离级别解决这些问题的方法是进行事务的隔离。MySQL支持四种隔离级别隔离级别越高性能效率越低读未提交READ UNCOMMITTED解决不了所有问题。读已提交READ COMMITTED能解决脏读但不能解决不可重复读和幻读。 MVCC可重复读REPEATABLE READ能解决脏读和不可重复读并通过间隙锁解决大部分幻读问题这也是MySQL的默认隔离级别 MVCC串行化SERIALIZABLE可以解决所有问题。可重复读解决幻读的方案针对快照读普通 select 语句是通过 MVCC 方式解决了幻读因为可重复读隔离级别下事务看到的数据一直是查询时看到的数据。针对当前读select … for update 等语句是通过 next-key lock记录锁间隙锁方式解决了幻读因为当执行 select … for update 语句的时候会加上 next-key lock会锁住一段范围的数据其他事务是不能操作这段数据的因此就很好地避免幻读问题。注除了普通的select语句是快照读其他比如 select… for update 或者 …for share 都是当前读。快照读读的是事务开始时的数据版本不管其他事务是否修改当前读指的是读取已提交的最新数据。 for update 表示我当前这个事务读取完数据后随后就要操作数据其他事务不能读或写for share指的是我读取完数据后其他事务可以读不能写。为什么可重复读不能完全解决幻读情况1.连续两次当前读两次之间可能有其他事务修改。2.先使用快照读后使用当前读两次之间可能有其他事务修改。19.Mysql中的锁Mysql锁有哪些如何理解按锁粒度分类行锁锁某行数据锁粒度最小并发度高开销大使用场景高并发、频繁修改某一行数据的场景只有InnoDB存储引擎支持表锁锁整张表锁粒度最大并发度低开销小使用场景数据迁移备份全表更新间隙锁锁的是一个区间使用场景防止其他事务在区间内插入新数据解决幻读只在可重复读Repeatable Read及以上隔离级别生效示例锁定id BETWEEN 10 AND 20则其他事务无法在此区间插入新记录。还可以分为共享锁S锁也就是读锁一个事务给某个数据加了读锁其他事务也可以读但是不能写排它锁X锁也就是写锁一个事务给某数据加了写锁其他事务不能读也不能写还可以分为乐观锁并不会真正的去锁举记录而是通过一个版本号来实现的每修改一次数据版本号加一悲观锁上面所的行锁、表锁等都是悲观锁20.left join、inner join、right join的区别三种JOIN的区别主要看以哪个表为基准INNER JOIN只返回两个表都匹配的行LEFT JOIN返回左表所有行右表匹配不上显示NULLRIGHT JOIN返回右表所有行左表匹配不上显示NULL比如说现在有两张表公司员工表项目参与名单inner join查询既是公司员工又参与了项目的人left join查询公司员工中参与项目的人right join查询参加项目的人中有几个是公司员工21.Mysql性能怎么优化性能优化的第一步是找到瓶颈先通过慢查询日志找到执行比较慢的sql然后通过 explain 进行分析如果是索引的问题我们要遵循索引的创建原则避免索引失效然后我们可以优化表的结构选择合适的字段类型可以参考《阿里开发手册 ( 嵩山版 ) 》最后我们对 sql 语句进行检查有没有使用 select *等等。
延伸阅读

更多相关文章

2026/10/21 1:45:55

ULN2803:八通道达林顿晶体管阵列,驱动控制的可靠之选

一、产品简介ULN2803 是一款高性能的八通道达林顿晶体管阵列,专为满足各种复杂驱动控制需求而设计。它采用先进的半导体制造工艺,将八个 NPN 达林顿连接晶体管集成在一个芯片上,能够实现低逻辑电平数字电路(如 TTL、CMOS 或 PMOS/…

2026/10/21 1:45:55

6种3D光学传感技术原理与选型实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 1:45:55

MC_Power、MC_Home、MC_MoveRelative三段式运动控制状态机实现与调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 3:11:06

AI Agent可靠性工程:从搭建到上线的完整实战指南

近两年“AI Agent”这个词在技术社区里几乎被说烂了。我见过不少团队拿大模型API拼了个Agent demo,演示时效果惊艳,结果一上真实场景就频繁翻车:工具参数传错、上下文串台、模型自作主张执行了不该执行的操作。问题往往不是模型不够聪明&…

2026/10/21 3:11:06

零GPU本地部署大模型:LocalAI CPU推理实战与OpenAI API无缝兼容

最近在折腾内部工具的时候,发现一个特别有意思的问题:我们团队手上只有几台普通的台式机,没有专业显卡,但业务上又确实需要跑一些大语言模型来处理文档、做点简单的智能问答。云上的模型服务不是不能用,但数据要过一道…

2026/10/21 3:11:06

MYPHP企业建站系统解析:三语切换、后台维护与二次开发实战

简介:MYPHP企业建站系统 v4.2 UTF-8 简繁英三语版是一套免费开源的企业建站PHP源码,面向需要快速搭建企业官网的站长、建站公司及PHP初学者。系统专注企业建站场景,操作简便、界面友好,内置简繁英三语支持,可在较短时间…

2026/10/21 3:11:06

顶帽变换实战:形态学运算解决光照不均与缺陷检测

1. 顶帽变换到底是什么:从一次表面缺陷检测说起1.1 光照不均为什么让阈值分割直接失灵两年前我接过一个金属零件表面质量检测的小项目,任务并不复杂:从生产线上拍下来的零件图里,找出表面残留的加工亮斑。图片分辨率不高&#xff…

2026/10/21 3:11:06

动物园管理系统实战:从数据库设计到业务闭环

1. 项目背景与核心价值1.1 动物园管理系统到底在解决什么问题我在一些线下走访和交流中经常听到这样的抱怨:某家动物园的游客服务中心还在用Excel登记团队预约,饲养员喂完动物后靠微信群上报,动物生病了翻阅纸质病历卡,库存饲料过…

2026/10/21 3:06:06

RAG效果差?问题多半出在知识库管理:清洗、分块与治理实战

先说明一点:这个标题我深有同感。做了大半年RAG相关的东西,见过不少团队把精力全压在召回链路调参上,结果效果上不去,最后排查一圈,问题全出在知识库本身——脏数据、错分块、无版本、无评测,源头一乱&…

2026/10/19 18:06:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/21 0:00:35

交通流仿真实战:IDM跟驰与MOBIL换道模型参数调优与避坑指南

简介:这份资源是面向交通工程学习者与Python开发者的微观交通流仿真项目,核心实现智能驾驶模型(IDM)下的车辆跟驰与换道行为,可用于理解速度、密度与流量之间的动态关系,适合具备Python基础、希望深入交通模…

2026/10/21 0:00:35

揭穿智能体表面顺从:用追踪代码重建任务执行确定性

1. 表面顺从不是智能体的“礼貌”,而是任务执行链路上的隐性断点最近在调试一个跨平台长周期任务调度系统时,我反复遇到一种令人困惑的现象:智能体在用户指令发出后,几乎秒级响应“已收到”“正在处理”“请稍候”,UI上…

2026/10/21 0:00:35

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑