数据库性能优化实战

系列导读:本篇将深入讲解数据库性能优化的核心方法与实战技巧。


文章目录

    • [一、SQL 优化](#一、SQL 优化)
      • [1.1 慢查询分析](#1.1 慢查询分析)
      • [1.2 EXPLAIN 解读](#1.2 EXPLAIN 解读)
      • [1.3 优化原则](#1.3 优化原则)
    • 二、索引优化
      • [2.1 索引类型](#2.1 索引类型)
      • [2.2 索引设计原则](#2.2 索引设计原则)
      • [2.3 组合索引示例](#2.3 组合索引示例)
    • 三、架构优化
      • [3.1 读写分离](#3.1 读写分离)
      • [3.2 分库分表](#3.2 分库分表)
      • [3.3 缓存策略](#3.3 缓存策略)
    • 四、连接池优化
      • [4.1 HikariCP 配置](#4.1 HikariCP 配置)
      • [4.2 连接池监控](#4.2 连接池监控)
    • 总结

一、SQL 优化

1.1 慢查询分析

sql 复制代码
-- 开启慢查询日志
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1;

-- 分析慢查询
EXPLAIN SELECT * FROM orders WHERE user_id = 100;

1.2 EXPLAIN 解读

字段 说明
type 访问类型(ALL/index/range/ref/const)
key 使用的索引
rows 扫描行数
Extra 额外信息

1.3 优化原则

sql 复制代码
-- 避免 SELECT *
SELECT id, name FROM users WHERE id = 1;

-- 避免函数操作
-- 差
SELECT * FROM orders WHERE DATE(create_time) = '2024-01-01';
-- 好
SELECT * FROM orders WHERE create_time >= '2024-01-01' AND create_time < '2024-01-02';

-- 避免 OR
-- 差
SELECT * FROM users WHERE name = '张三' OR age = 20;
-- 好
SELECT * FROM users WHERE name = '张三'
UNION
SELECT * FROM users WHERE age = 20;

-- 分页优化
-- 差
SELECT * FROM orders LIMIT 1000000, 10;
-- 好
SELECT * FROM orders WHERE id > 1000000 LIMIT 10;

二、索引优化

2.1 索引类型

类型 说明
主键索引 唯一、非空
唯一索引 唯一
普通索引 加速查询
组合索引 多列索引
全文索引 文本搜索

2.2 索引设计原则

复制代码
1. 选择区分度高的列
2. 遵循最左前缀原则
3. 覆盖索引减少回表
4. 控制索引数量
5. 避免冗余索引

2.3 组合索引示例

sql 复制代码
-- 组合索引
CREATE INDEX idx_user_status_time ON orders(user_id, status, create_time);

-- 命中索引
SELECT * FROM orders WHERE user_id = 1;
SELECT * FROM orders WHERE user_id = 1 AND status = 1;
SELECT * FROM orders WHERE user_id = 1 AND status = 1 AND create_time > '2024-01-01';

-- 不命中索引
SELECT * FROM orders WHERE status = 1;
SELECT * FROM orders WHERE create_time > '2024-01-01';

三、架构优化

3.1 读写分离

yaml 复制代码
# ShardingSphere 配置
spring:
  shardingsphere:
    datasource:
      names: master,slave
      master:
        type: com.zaxxer.hikari.HikariDataSource
        jdbc-url: jdbc:mysql://master:3306/mydb
      slave:
        type: com.zaxxer.hikari.HikariDataSource
        jdbc-url: jdbc:mysql://slave:3306/mydb
    rules:
      readwrite-splitting:
        data-sources:
          myds:
            write-data-source-name: master
            read-data-source-names: slave

3.2 分库分表

yaml 复制代码
# 分片配置
spring:
  shardingsphere:
    rules:
      sharding:
        tables:
          t_order:
            actual-data-nodes: ds${0..1}.t_order_${0..1}
            table-strategy:
              standard:
                sharding-column: order_id
                sharding-algorithm-name: order-inline

3.3 缓存策略

java 复制代码
// 缓存穿透防护
public User getUser(Long id) {
    String key = "user:" + id;
    User user = redisTemplate.opsForValue().get(key);
    
    if (user != null) {
        return user;
    }
    
    // 防止缓存穿透
    if (redisTemplate.hasKey("null:" + id)) {
        return null;
    }
    
    user = userMapper.selectById(id);
    
    if (user != null) {
        redisTemplate.opsForValue().set(key, user, 1, TimeUnit.HOURS);
    } else {
        // 空值缓存
        redisTemplate.opsForValue().set("null:" + id, "", 5, TimeUnit.MINUTES);
    }
    
    return user;
}

四、连接池优化

4.1 HikariCP 配置

yaml 复制代码
spring:
  datasource:
    hikari:
      minimum-idle: 10
      maximum-pool-size: 50
      idle-timeout: 600000
      max-lifetime: 1800000
      connection-timeout: 30000
      pool-name: OrderHikariPool

4.2 连接池监控

java 复制代码
// 获取连接池状态
HikariDataSource dataSource = (HikariDataSource) applicationContext.getBean(DataSource.class);
HikariPoolMXBean pool = dataSource.getHikariPoolMXBean();

log.info("活跃连接: {}", pool.getActiveConnections());
log.info("空闲连接: {}", pool.getIdleConnections());
log.info("等待线程: {}", pool.getThreadsAwaitingConnection());

总结

✅ SQL 优化 :慢查询、EXPLAIN、优化原则

✅ 索引优化 :类型、设计原则、组合索引

✅ 架构优化 :读写分离、分库分表、缓存

✅ 连接池优化:HikariCP 配置、监控


作者 :刘~浪地球
更新时间:2026-04-17

相关推荐
西红柿炖牛腩3544 分钟前
机房电脑不能联网,怎么离线把课件里的 3D 模型压小?Draco / Meshopt 参数清单
前端·javascript·3d·性能优化·大屏端
ly768918 分钟前
PostgreSQL 执行计划深读:从 EXPLAIN 输出到代价模型驱动的 SQL 改写
数据库·sql·postgresql·explain·执行计划·代价模型
Python自动化直播38 分钟前
自动化笔记:素材管理、命名、轮换的几条土办法
linux·运维·数据库
xiaomuzuirenzhen40 分钟前
2027校招ERP实施顾问:大数据管理与应用专业如何用SQL、BI证明业务能力
大数据·数据库
底层玩家老张1 小时前
从副本集到分片:百亿级文档数据的KES架构边界
数据库·分布式架构·分片·架构选型·文档数据库
ss2731 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 16 PostgreSQL子查询与嵌套查询(下)
数据库·笔记·postgresql
川石课堂软件测试1 小时前
涨薪技术|0到1学会性能测试第8课-Analysis分析图
服务器·数据库·python·sql·jmeter·mysql·容器
SelectDB技术团队1 小时前
云数仓成本结构拆解:五层计费模型与 Apache Doris 托管形态对照
大数据·数据库·elk·全文检索·snowflake
我命由我123452 小时前
SQL 检测脚本
java·数据库·sql·功能测试·单元测试·压力测试·可用性测试
Zenova EdgeOS2 小时前
工业网关数据全链路加密实战:从传输、静态数据到密钥轮
数据库·oracle·边缘计算·工业网关