SpringBoot项目中MySQL优化核心是“怎么用、怎么稳、怎么快”:需结合真实业务建表、安全查询、事务控制与慢SQL调优,通过EXPLAIN验证索引、HikariCP合理配连接池、PreparedStatement防注入、@Transactional明确传播行为。

直接上手练,别等“全学会再开干”。Java 后端场景下的 MySQL 考点,本质是围绕“怎么用、怎么稳、怎么快”展开的——不是考你背概念,而是看你能不能在 SpringBoot 项目里正确建表、安全查数据、避免事务翻车、让慢查询变快。
一、从项目真实需求倒推 SQL 能力
面试和实战中,90% 的 SQL 问题都来自具体业务动作:
- 用户注册 → 插入一条带时间戳、加密密码的记录(INSERT + DEFAULT/CURRENT_TIMESTAMP + bcrypt 处理逻辑前置)
- 订单列表页按状态+时间筛选 → 多条件 WHERE + 排序 + 分页(WHERE status = ? AND create_time > ? ORDER BY id DESC LIMIT ?,?)
- 修改商品库存同时扣减用户余额 → 两条 UPDATE 必须原子执行(显式开启事务 + try-catch 中 rollback)
- 搜索商品名含“手机”的记录 → LIKE “%手机%” 效率低,考虑全文索引或 ES 替代(不盲目写模糊查询,先看数据量和 QPS)
二、高频翻车点必须亲手验证
光看文档不会暴露问题,只有执行才会踩坑:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
字符集乱码:建库时漏写
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci,存 emoji 或生僻字直接报错或截断 - NULL 和空字符串混用:Java 中 String.isEmpty() 判空,但数据库字段允许 NULL,导致 WHERE name = '' 查不到 NULL 记录
-
时间类型选错:用
DATETIME存创建时间没问题,但做范围统计时若用TIMESTAMP可能因时区自动转换出偏差 -
自增主键溢出:ID 设为
INT,百万级数据后插入失败(改用BIGINT或 UUID/雪花 ID 更稳妥)
三、索引优化不能只背口诀
“最左前缀”“回表”“覆盖索引”这些词,得结合 EXPLAIN 看懂执行计划:
立即学习“Java免费学习笔记(深入)”;
- 写完 WHERE 条件后,立刻加
EXPLAIN SELECT ...,看type是不是range或ref,key是否命中预期索引 - 联合索引
(a,b,c),WHERE 中只用b = ?不走索引;但a = ? AND c = ?会走(c虽跳过b,但优化器可能利用索引排序特性) - SELECT * 容易触发回表;如果只查
id, name, age,而索引是(name, age),可改成SELECT id, name, age并确保id是主键(InnoDB 主键天然包含在二级索引叶子节点)
四、Java 连接层必须盯紧三件事
SpringBoot + MySQL 组合下,多数性能与安全问题出在 JDBC 层:
-
连接池配置:HikariCP 的
maximumPoolSize别设成 1000,根据 DB 最大连接数和应用并发量合理设(常见 20~50) -
SQL 注入防护:永远不用
String.format拼接 WHERE 条件;PreparedStatement占位符是底线 -
事务传播行为:@Transactional 默认
REQUIRED,但嵌套调用时若方法 A 调 B,B 抛异常未捕获,A 也会回滚——要明确是否需要REQUIRES_NEW

















