<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>面试 on 吾爱主机</title><link>https://blog.waihost.com/categories/%E9%9D%A2%E8%AF%95/</link><description>Recent content in 面试 on 吾爱主机</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 25 Jun 2026 10:05:00 +0000</lastBuildDate><atom:link href="https://blog.waihost.com/categories/%E9%9D%A2%E8%AF%95/index.xml" rel="self" type="application/rss+xml"/><item><title>2025 Java MySQL 面试高频题汇总</title><link>https://blog.waihost.com/posts/java-mysql-interview-2025/</link><pubDate>Thu, 25 Jun 2026 10:05:00 +0000</pubDate><guid>https://blog.waihost.com/posts/java-mysql-interview-2025/</guid><description>&lt;img src="https://blog.waihost.com/images/covers/java-mysql-interview-2025.svg" alt="Featured image of post 2025 Java MySQL 面试高频题汇总" /&gt;&lt;h2 id="前言"&gt;&lt;a href="#%e5%89%8d%e8%a8%80" class="header-anchor"&gt;&lt;/a&gt;前言
&lt;/h2&gt;&lt;p&gt;本文整理了 2025 年 Java 后端开发面试中 MySQL 相关的高频考点，涵盖索引优化、事务隔离、锁机制、SQL 调优等核心内容，帮助候选人系统复习、高效备战。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一mysql-索引相关"&gt;&lt;a href="#%e4%b8%80mysql-%e7%b4%a2%e5%bc%95%e7%9b%b8%e5%85%b3" class="header-anchor"&gt;&lt;/a&gt;一、MySQL 索引相关
&lt;/h2&gt;&lt;h3 id="11-为什么-mysql-使用-b-树而不是-b-树"&gt;&lt;a href="#11-%e4%b8%ba%e4%bb%80%e4%b9%88-mysql-%e4%bd%bf%e7%94%a8-b-%e6%a0%91%e8%80%8c%e4%b8%8d%e6%98%af-b-%e6%a0%91" class="header-anchor"&gt;&lt;/a&gt;1.1 为什么 MySQL 使用 B+ 树而不是 B 树？
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;B+ 树&lt;/strong&gt;叶子节点形成有序链表，范围查询效率更高&lt;/li&gt;
&lt;li&gt;非叶子节点只存储索引，单个页能容纳更多索引，树高更矮，IO 次数更少&lt;/li&gt;
&lt;li&gt;所有查询都落到叶子节点，查询性能稳定&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-聚簇索引和非聚簇索引的区别"&gt;&lt;a href="#12-%e8%81%9a%e7%b0%87%e7%b4%a2%e5%bc%95%e5%92%8c%e9%9d%9e%e8%81%9a%e7%b0%87%e7%b4%a2%e5%bc%95%e7%9a%84%e5%8c%ba%e5%88%ab" class="header-anchor"&gt;&lt;/a&gt;1.2 聚簇索引和非聚簇索引的区别？
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;聚簇索引&lt;/th&gt;
					&lt;th&gt;非聚簇索引（二级索引）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;数据存储&lt;/td&gt;
					&lt;td&gt;叶子节点存储完整数据行&lt;/td&gt;
					&lt;td&gt;叶子节点存储主键值&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;查询方式&lt;/td&gt;
					&lt;td&gt;直接获取数据&lt;/td&gt;
					&lt;td&gt;需要回表查询&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数量限制&lt;/td&gt;
					&lt;td&gt;一张表只有一个&lt;/td&gt;
					&lt;td&gt;可以有多个&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="13-什么是覆盖索引"&gt;&lt;a href="#13-%e4%bb%80%e4%b9%88%e6%98%af%e8%a6%86%e7%9b%96%e7%b4%a2%e5%bc%95" class="header-anchor"&gt;&lt;/a&gt;1.3 什么是覆盖索引？
&lt;/h3&gt;&lt;p&gt;覆盖索引是指查询的列全部在索引中，不需要回表查询主键索引就能获取数据，显著提升查询性能。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 假设有联合索引 idx_name_age(name, age)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;张三&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 此查询走覆盖索引，无需回表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="14-索引失效的常见场景"&gt;&lt;a href="#14-%e7%b4%a2%e5%bc%95%e5%a4%b1%e6%95%88%e7%9a%84%e5%b8%b8%e8%a7%81%e5%9c%ba%e6%99%af" class="header-anchor"&gt;&lt;/a&gt;1.4 索引失效的常见场景
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;使用 &lt;code&gt;LIKE '%xxx'&lt;/code&gt; 左模糊查询&lt;/li&gt;
&lt;li&gt;对索引列使用函数或表达式&lt;/li&gt;
&lt;li&gt;隐式类型转换&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;OR&lt;/code&gt; 连接非索引列&lt;/li&gt;
&lt;li&gt;联合索引未遵循最左前缀原则&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NOT IN&lt;/code&gt;、&lt;code&gt;NOT EXISTS&lt;/code&gt;、&lt;code&gt;!=&lt;/code&gt;、&lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt; 可能导致失效&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="二事务与隔离级别"&gt;&lt;a href="#%e4%ba%8c%e4%ba%8b%e5%8a%a1%e4%b8%8e%e9%9a%94%e7%a6%bb%e7%ba%a7%e5%88%ab" class="header-anchor"&gt;&lt;/a&gt;二、事务与隔离级别
&lt;/h2&gt;&lt;h3 id="21-事务的-acid-特性"&gt;&lt;a href="#21-%e4%ba%8b%e5%8a%a1%e7%9a%84-acid-%e7%89%b9%e6%80%a7" class="header-anchor"&gt;&lt;/a&gt;2.1 事务的 ACID 特性
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A（原子性）&lt;/strong&gt;：undo log 实现，事务要么全部成功，要么全部回滚&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C（一致性）&lt;/strong&gt;：由其他三个特性共同保证&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I（隔离性）&lt;/strong&gt;：锁机制 + MVCC 实现&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;D（持久性）&lt;/strong&gt;：redo log 实现&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-四种隔离级别"&gt;&lt;a href="#22-%e5%9b%9b%e7%a7%8d%e9%9a%94%e7%a6%bb%e7%ba%a7%e5%88%ab" class="header-anchor"&gt;&lt;/a&gt;2.2 四种隔离级别
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;隔离级别&lt;/th&gt;
					&lt;th&gt;脏读&lt;/th&gt;
					&lt;th&gt;不可重复读&lt;/th&gt;
					&lt;th&gt;幻读&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;READ UNCOMMITTED&lt;/td&gt;
					&lt;td&gt;✓&lt;/td&gt;
					&lt;td&gt;✓&lt;/td&gt;
					&lt;td&gt;✓&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;READ COMMITTED&lt;/td&gt;
					&lt;td&gt;✗&lt;/td&gt;
					&lt;td&gt;✓&lt;/td&gt;
					&lt;td&gt;✓&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;REPEATABLE READ（默认）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;✗&lt;/td&gt;
					&lt;td&gt;✗&lt;/td&gt;
					&lt;td&gt;✗*&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SERIALIZABLE&lt;/td&gt;
					&lt;td&gt;✗&lt;/td&gt;
					&lt;td&gt;✗&lt;/td&gt;
					&lt;td&gt;✗&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;InnoDB 在 RR 级别下通过 MVCC + Next-Key Lock 解决了大部分幻读问题。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="23-mvcc-实现原理"&gt;&lt;a href="#23-mvcc-%e5%ae%9e%e7%8e%b0%e5%8e%9f%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;2.3 MVCC 实现原理
&lt;/h3&gt;&lt;p&gt;MVCC（多版本并发控制）通过以下机制实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;隐藏列&lt;/strong&gt;：每行数据包含 &lt;code&gt;DB_TRX_ID&lt;/code&gt;（事务ID）、&lt;code&gt;DB_ROLL_PTR&lt;/code&gt;（回滚指针）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;undo log&lt;/strong&gt;：形成版本链&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read View&lt;/strong&gt;：根据事务启动时机判断可见性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;RC 与 RR 的区别&lt;/strong&gt;：RC 每次查询生成新的 Read View，RR 只在事务第一次查询时生成。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="三锁机制"&gt;&lt;a href="#%e4%b8%89%e9%94%81%e6%9c%ba%e5%88%b6" class="header-anchor"&gt;&lt;/a&gt;三、锁机制
&lt;/h2&gt;&lt;h3 id="31-innodb-锁类型"&gt;&lt;a href="#31-innodb-%e9%94%81%e7%b1%bb%e5%9e%8b" class="header-anchor"&gt;&lt;/a&gt;3.1 InnoDB 锁类型
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;共享锁（S Lock）&lt;/strong&gt;：读锁，多个事务可共享&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;排他锁（X Lock）&lt;/strong&gt;：写锁，互斥&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;意向锁（IS/IX）&lt;/strong&gt;：表级锁，标识事务意图&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;间隙锁（Gap Lock）&lt;/strong&gt;：锁定索引间隙，防止幻读&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;临键锁（Next-Key Lock）&lt;/strong&gt;：记录锁 + 间隙锁，左开右闭区间&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="32-死锁如何产生和解决"&gt;&lt;a href="#32-%e6%ad%bb%e9%94%81%e5%a6%82%e4%bd%95%e4%ba%a7%e7%94%9f%e5%92%8c%e8%a7%a3%e5%86%b3" class="header-anchor"&gt;&lt;/a&gt;3.2 死锁如何产生和解决？
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;产生条件&lt;/strong&gt;：两个或多个事务互相等待对方持有的锁。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;排查方法&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SHOW&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ENGINE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;INNODB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;STATUS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- 查看最近死锁信息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;information_schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INNODB_TRX&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- 查看当前事务
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;按固定顺序访问表和行&lt;/li&gt;
&lt;li&gt;大事务拆小事务&lt;/li&gt;
&lt;li&gt;设置合理的锁等待超时 &lt;code&gt;innodb_lock_wait_timeout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用低隔离级别（业务允许时）&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="四sql-优化"&gt;&lt;a href="#%e5%9b%9bsql-%e4%bc%98%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;四、SQL 优化
&lt;/h2&gt;&lt;h3 id="41-explain-执行计划关键字段"&gt;&lt;a href="#41-explain-%e6%89%a7%e8%a1%8c%e8%ae%a1%e5%88%92%e5%85%b3%e9%94%ae%e5%ad%97%e6%ae%b5" class="header-anchor"&gt;&lt;/a&gt;4.1 EXPLAIN 执行计划关键字段
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;EXPLAIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;张三&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重点关注字段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;type&lt;/strong&gt;：访问类型，性能从好到差 &lt;code&gt;system &amp;gt; const &amp;gt; eq_ref &amp;gt; ref &amp;gt; range &amp;gt; index &amp;gt; ALL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;key&lt;/strong&gt;：实际使用的索引&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;rows&lt;/strong&gt;：预估扫描行数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extra&lt;/strong&gt;：&lt;code&gt;Using index&lt;/code&gt;（覆盖索引）、&lt;code&gt;Using filesort&lt;/code&gt;（文件排序）、&lt;code&gt;Using temporary&lt;/code&gt;（临时表）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="42-慢查询优化思路"&gt;&lt;a href="#42-%e6%85%a2%e6%9f%a5%e8%af%a2%e4%bc%98%e5%8c%96%e6%80%9d%e8%b7%af" class="header-anchor"&gt;&lt;/a&gt;4.2 慢查询优化思路
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;开启慢查询日志定位问题 SQL&lt;/li&gt;
&lt;li&gt;使用 EXPLAIN 分析执行计划&lt;/li&gt;
&lt;li&gt;合理添加索引（遵循最左前缀原则）&lt;/li&gt;
&lt;li&gt;避免 &lt;code&gt;SELECT *&lt;/code&gt;，只查询需要的列&lt;/li&gt;
&lt;li&gt;分页优化：深分页使用延迟关联&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 深分页优化：先查主键再关联
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INNER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;JOIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;LIMIT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="43-join-优化"&gt;&lt;a href="#43-join-%e4%bc%98%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;4.3 JOIN 优化
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;小表驱动大表&lt;/li&gt;
&lt;li&gt;被驱动表关联字段加索引&lt;/li&gt;
&lt;li&gt;避免 &lt;code&gt;LEFT JOIN&lt;/code&gt; 时 ON 条件使用 &lt;code&gt;OR&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="五mysql-架构"&gt;&lt;a href="#%e4%ba%94mysql-%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;五、MySQL 架构
&lt;/h2&gt;&lt;h3 id="51-innodb-架构核心组件"&gt;&lt;a href="#51-innodb-%e6%9e%b6%e6%9e%84%e6%a0%b8%e5%bf%83%e7%bb%84%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;5.1 InnoDB 架构核心组件
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Buffer Pool&lt;/strong&gt;：缓存数据页和索引页&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Change Buffer&lt;/strong&gt;：缓存非唯一二级索引的写操作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log Buffer&lt;/strong&gt;：缓存 redo log&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;redo log&lt;/strong&gt;：保证事务持久性（WAL 机制）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;undo log&lt;/strong&gt;：保证事务原子性，支持 MVCC&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="52-binlogredo-logundo-log-区别"&gt;&lt;a href="#52-binlogredo-logundo-log-%e5%8c%ba%e5%88%ab" class="header-anchor"&gt;&lt;/a&gt;5.2 binlog、redo log、undo log 区别
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;binlog&lt;/th&gt;
					&lt;th&gt;redo log&lt;/th&gt;
					&lt;th&gt;undo log&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;层级&lt;/td&gt;
					&lt;td&gt;Server 层&lt;/td&gt;
					&lt;td&gt;InnoDB 引擎&lt;/td&gt;
					&lt;td&gt;InnoDB 引擎&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;内容&lt;/td&gt;
					&lt;td&gt;逻辑日志&lt;/td&gt;
					&lt;td&gt;物理日志&lt;/td&gt;
					&lt;td&gt;逻辑日志&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;作用&lt;/td&gt;
					&lt;td&gt;主从复制、数据恢复&lt;/td&gt;
					&lt;td&gt;崩溃恢复&lt;/td&gt;
					&lt;td&gt;事务回滚、MVCC&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;写入方式&lt;/td&gt;
					&lt;td&gt;追加写入&lt;/td&gt;
					&lt;td&gt;循环写入&lt;/td&gt;
					&lt;td&gt;追加写入&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="53-两阶段提交2pc"&gt;&lt;a href="#53-%e4%b8%a4%e9%98%b6%e6%ae%b5%e6%8f%90%e4%ba%a42pc" class="header-anchor"&gt;&lt;/a&gt;5.3 两阶段提交（2PC）
&lt;/h3&gt;&lt;p&gt;为了保证 binlog 和 redo log 的一致性：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;prepare 阶段&lt;/strong&gt;：redo log 写入磁盘，标记为 prepare&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commit 阶段&lt;/strong&gt;：binlog 写入磁盘后，redo log 标记为 commit&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="六高频场景题"&gt;&lt;a href="#%e5%85%ad%e9%ab%98%e9%a2%91%e5%9c%ba%e6%99%af%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;六、高频场景题
&lt;/h2&gt;&lt;h3 id="61-分库分表方案"&gt;&lt;a href="#61-%e5%88%86%e5%ba%93%e5%88%86%e8%a1%a8%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;6.1 分库分表方案
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;垂直分库&lt;/strong&gt;：按业务拆分（订单库、用户库）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;水平分表&lt;/strong&gt;：按行拆分（取模、范围、时间）&lt;/li&gt;
&lt;li&gt;常用中间件：ShardingSphere、MyCat&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="62-如何设计一个高并发的秒杀数据库方案"&gt;&lt;a href="#62-%e5%a6%82%e4%bd%95%e8%ae%be%e8%ae%a1%e4%b8%80%e4%b8%aa%e9%ab%98%e5%b9%b6%e5%8f%91%e7%9a%84%e7%a7%92%e6%9d%80%e6%95%b0%e6%8d%ae%e5%ba%93%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;6.2 如何设计一个高并发的秒杀数据库方案？
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;热点数据缓存到 Redis&lt;/li&gt;
&lt;li&gt;库存扣减使用 Redis 原子操作预扣&lt;/li&gt;
&lt;li&gt;订单写入异步队列&lt;/li&gt;
&lt;li&gt;数据库层面乐观锁更新&lt;/li&gt;
&lt;li&gt;分库分表减少单表压力&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 乐观锁扣减库存
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;goods&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1001&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结
&lt;/h2&gt;&lt;p&gt;2025 年 Java MySQL 面试依然围绕 &lt;strong&gt;索引原理&lt;/strong&gt;、&lt;strong&gt;事务隔离&lt;/strong&gt;、&lt;strong&gt;锁机制&lt;/strong&gt;、&lt;strong&gt;SQL 优化&lt;/strong&gt; 四大核心主题展开。理解底层原理比死记硬背更重要，建议结合源码和实际项目经验深入学习。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;推荐书籍：《高性能 MySQL》《MySQL 技术内幕：InnoDB 存储引擎》&lt;/p&gt;

 &lt;/blockquote&gt;</description></item></channel></rss>