当前位置: 代码网 > it编程>数据库>Mysql > MySQL中慢查询优化的技术指南

MySQL中慢查询优化的技术指南

2025年06月24日 Mysql 我要评论
1、简述在java 后端开发中,数据库是系统性能瓶颈的高发地带,而慢 sql 查询往往是系统响应迟缓的“罪魁祸首”。本文将全面梳理慢 sql 的优化思路,并结合 java 示例

1、简述

在 java 后端开发中,数据库是系统性能瓶颈的高发地带,而 慢 sql 查询 往往是系统响应迟缓的“罪魁祸首”。本文将全面梳理慢 sql 的优化思路,并结合 java 示例进行实战演练。

2、慢查询的常见表现

慢查询通常表现为:

  • 接口响应时间缓慢
  • 数据库 cpu 占用高
  • 表锁、死锁频繁
  • java 应用线程池阻塞严重

慢 sql 的主要成因

成因类型说明
未使用索引全表扫描,查询耗时
使用了低效的函数或表达式如 like '%xx%', date()
多表关联不当join 条件缺失或不走索引
过多返回字段只用到了部分字段却 select *
where 条件不精准无法过滤大量无关数据
数据库设计不合理字段冗余、缺乏范式、字段类型错误等

3、慢查询优化的通用思路

加索引(重点)

为 where、join、order by、group by 中涉及的字段加索引

避免使用函数包裹字段,如 left(name, 3),会导致无法使用索引

使用 explain 分析执行计划

explain select * from orders where user_id = 100;

关注字段:

字段说明
type连接类型(越接近 const 越好)
rows扫描行数(越小越好)
key使用的索引名称
extra是否使用临时表、排序等

分页优化

避免深度分页:

-- 慢查询(跳过大量行)
select * from orders limit 1000000, 20;

-- 推荐(使用上次主键记录)
select * from orders where id > 1000000 limit 20;

拆表分区

垂直拆分:将大表按字段拆分为多个表

水平分表:按业务字段分库分表(如 user_id 分表)

分区表:mysql 原生支持(适合历史归档数据)

减少嵌套子查询

使用 join 或临时表替代子查询,更高效。

sql 只查需要的字段

-- 慎用
select * from user;

-- 推荐
select id, name, email from user;

4、慢 sql 实践排查与优化

示例:慢查询前后对比

原始 sql(慢)

select * from orders where date(create_time) = '2024-01-01';

问题:

  • 使用了 date() 函数,索引失效
  • 全表扫描,耗时严重

优化 sql(快)

select * from orders 
where create_time >= '2024-01-01 00:00:00' 
  and create_time < '2024-01-02 00:00:00';

优点:

  • 范围查询走索引
  • 支持时间范围过滤

java 中日志配置监控慢 sql

# application.yml 示例(spring boot)
logging:
  level:
    com.zaxxer.hikari.hikariconfig: debug
    com.zaxxer.hikari: trace
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/demo
    username: root
    password: root
    hikari:
      maximum-pool-size: 10
      connection-timeout: 3000

使用工具(如 p6spy)打印 sql 及耗时,或开启 mysql 慢查询日志:

-- mysql 开启慢查询日志
set global slow_query_log = 'on';
set global long_query_time = 1; -- 超过 1 秒记录

sql 优化 checklist

  • 是否使用了合适的索引
  • 是否避免了函数、表达式阻碍索引
  • 是否使用了 explain 检查执行计划
  • 是否合理分页、避免深度翻页
  • 是否控制了查询字段数量
  • 是否考虑拆分大表或分区表
  • 是否避免了嵌套子查询

5、sql 优化实战样例

场景 1:模糊查询优化

-- 慢:前置通配符无法使用索引
select * from user where name like '%abc%';

-- 优化:使用全文索引或右模糊匹配
select * from user where name like 'abc%';

场景 2:避免函数阻碍索引

-- 慢
select * from orders where year(create_time) = 2024;

-- 快
select * from orders 
where create_time >= '2024-01-01' 
  and create_time < '2025-01-01';

场景 3:多字段组合索引使用顺序

-- 有联合索引 (user_id, status)

-- 推荐:user_id 和 status 都参与
select * from orders where user_id = 100 and status = 'paid';

-- 不推荐:只用 status,索引无法生效
select * from orders where status = 'paid';

6、结语

慢查询是系统性能优化的重要战场。对于 java 开发者而言,理解 sql 执行机制和优化原则,比“用缓存”更根本、更有效。

日常开发中,应做到:

  • 编写 sql 前先考虑是否能走索引
  • 查询慢时第一时间用 explain 排查
  • 数据库设计时就考虑查询结构

到此这篇关于mysql中慢查询优化的技术指南的文章就介绍到这了,更多相关mysql慢查询内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com