news 2026/4/18 0:53:22

数据库性能优化实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据库性能优化实战

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


文章目录

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

一、SQL 优化

1.1 慢查询分析

-- 开启慢查询日志SETGLOBALslow_query_log=ON;SETGLOBALlong_query_time=1;-- 分析慢查询EXPLAINSELECT*FROMordersWHEREuser_id=100;

1.2 EXPLAIN 解读

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

1.3 优化原则

-- 避免 SELECT *SELECTid,nameFROMusersWHEREid=1;-- 避免函数操作-- 差SELECT*FROMordersWHEREDATE(create_time)='2024-01-01';-- 好SELECT*FROMordersWHEREcreate_time>='2024-01-01'ANDcreate_time<'2024-01-02';-- 避免 OR-- 差SELECT*FROMusersWHEREname='张三'ORage=20;-- 好SELECT*FROMusersWHEREname='张三'UNIONSELECT*FROMusersWHEREage=20;-- 分页优化-- 差SELECT*FROMordersLIMIT1000000,10;-- 好SELECT*FROMordersWHEREid>1000000LIMIT10;

二、索引优化

2.1 索引类型

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

2.2 索引设计原则

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

2.3 组合索引示例

-- 组合索引CREATEINDEXidx_user_status_timeONorders(user_id,status,create_time);-- 命中索引SELECT*FROMordersWHEREuser_id=1;SELECT*FROMordersWHEREuser_id=1ANDstatus=1;SELECT*FROMordersWHEREuser_id=1ANDstatus=1ANDcreate_time>'2024-01-01';-- 不命中索引SELECT*FROMordersWHEREstatus=1;SELECT*FROMordersWHEREcreate_time>'2024-01-01';

三、架构优化

3.1 读写分离

# ShardingSphere 配置spring:shardingsphere:datasource:names:master,slavemaster:type:com.zaxxer.hikari.HikariDataSourcejdbc-url:jdbc:mysql://master:3306/mydbslave:type:com.zaxxer.hikari.HikariDataSourcejdbc-url:jdbc:mysql://slave:3306/mydbrules:readwrite-splitting:data-sources:myds:write-data-source-name:masterread-data-source-names:slave

3.2 分库分表

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

3.3 缓存策略

// 缓存穿透防护publicUsergetUser(Longid){Stringkey="user:"+id;Useruser=redisTemplate.opsForValue().get(key);if(user!=null){returnuser;}// 防止缓存穿透if(redisTemplate.hasKey("null:"+id)){returnnull;}user=userMapper.selectById(id);if(user!=null){redisTemplate.opsForValue().set(key,user,1,TimeUnit.HOURS);}else{// 空值缓存redisTemplate.opsForValue().set("null:"+id,"",5,TimeUnit.MINUTES);}returnuser;}

四、连接池优化

4.1 HikariCP 配置

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

4.2 连接池监控

// 获取连接池状态HikariDataSourcedataSource=(HikariDataSource)applicationContext.getBean(DataSource.class);HikariPoolMXBeanpool=dataSource.getHikariPoolMXBean();log.info("活跃连接: {}",pool.getActiveConnections());log.info("空闲连接: {}",pool.getIdleConnections());log.info("等待线程: {}",pool.getThreadsAwaitingConnection());

总结

SQL 优化:慢查询、EXPLAIN、优化原则
索引优化:类型、设计原则、组合索引
架构优化:读写分离、分库分表、缓存
连接池优化:HikariCP 配置、监控


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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 0:52:19

RISC-V Debug实战解析(一):基于JTAG协议的调试模块Verilog设计

1. 从零理解RISC-V调试系统架构 第一次接触RISC-V调试系统时&#xff0c;我被文档里那些缩写词搞得头晕眼花——DTM、DMI、DM这些概念就像天书一样。直到亲手用Verilog实现了一个JTAG调试模块&#xff0c;才真正搞明白它们之间的关系。想象你正在用电脑调试一块RISC-V开发板&am…

作者头像 李华
网站建设 2026/4/18 0:49:52

DeepSeek总结的我们所熟知的互联网即将终结

我们所熟知的互联网即将终结 2026-04-15 | 1201词 上周&#xff0c;Anthropic 公司宣布&#xff0c;其最新的人工智能模型 Claude Mythos 预览版将不会向公众发布&#xff0c;此前该公司获悉&#xff0c;该模型能够发现并利用那些在关键软件系统中潜藏了数十年未被察觉的漏洞…

作者头像 李华
网站建设 2026/4/18 0:40:19

生成式AI应用实时通信方案全栈拆解,从Token流调度、WebSocket心跳优化到边缘推理协同

第一章&#xff1a;生成式AI应用实时通信方案全栈概览 2026奇点智能技术大会(https://ml-summit.org) 生成式AI应用对低延迟、高并发、上下文感知的实时通信能力提出了全新要求。传统REST API轮询或短连接模式已难以支撑流式响应、多模态协同与会话状态持续同步等核心场景&…

作者头像 李华
网站建设 2026/4/18 0:39:32

D3KeyHelper终极指南:5分钟配置你的暗黑3自动技能宏

D3KeyHelper终极指南&#xff1a;5分钟配置你的暗黑3自动技能宏 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 暗黑破坏神3的重复操作让你感到疲惫&…

作者头像 李华
网站建设 2026/4/18 0:36:11

多任务学习(MTL)实战:从加权策略到不确定性建模

1. 多任务学习入门&#xff1a;从单任务到多任务的跃迁 第一次接触多任务学习&#xff08;MTL&#xff09;时&#xff0c;我正被公司要求同时优化推荐系统的点击率和停留时长两个指标。当时傻乎乎地训练了两个独立模型&#xff0c;结果线上部署时发现资源消耗翻倍&#xff0c;两…

作者头像 李华