封面图片

问题背景介绍

在大型互联网或企业级应用中,数据库往往成为系统性能的瓶颈。随着数据量和并发量的增长,单一的 SQL 查询可能出现响应迟缓、锁等待、全表扫描等性能问题。为保证系统的稳定性和用户体验,需要对 SQL 查询做深入的调优。常见的调优手段包括索引优化、查询重写、分库分表、缓存方案等。本文将从多种方案入手,对比分析各自优缺点,并结合真实生产环境案例展示调优效果。

多种解决方案对比

方案 A:索引优化

  • 原理:为频繁筛选或排序的列建立合适的索引,避免全表扫描。
  • 实现:使用 B-Tree、哈希索引或覆盖索引。

示例:为订单表的 user_idcreated_at 建联合索引:

ALTER TABLE orders ADD INDEX idx_user_created (user_id, created_at DESC);

使用 EXPLAIN 查看执行计划:

EXPLAIN SELECT * FROM orders WHERE user_id = 1234 ORDER BY created_at DESCLIMIT 10;

方案 B:查询重写与分页优化

  • 原理:通过拆分复杂 SQL,避免大范围排序与联表;优化分页查询。
  • 实现:利用覆盖索引分页、二次过滤或游标。

示例:传统高页码分页会严重影响性能:

SELECT * FROM orders WHERE user_id = 1234 ORDER BY created_at DESC LIMIT 100000, 20;

重写为“基于最后读取位置的分页”:

-- 前一页最后一行的 created_at 值
SET @last_time = '2024-07-01 12:34:56';SELECT * FROM ordersWHERE user_id = 1234AND created_at < @last_timeORDER BY created_at DESC LIMIT 20;

方案 C:分区表 & 分库分表

  • 原理:通过按时间或用户 ID 手动/自动划分表或数据库,减少单表或单库数据量。
  • 实现:MySQL 原生分区、Proxy 层分片、ShardingSphere 等。

示例:按月份进行分区:

ALTER TABLE ordersPARTITION BY RANGE (TO_DAYS(created_at)) (PARTITION p202407 VALUES LESS THAN (TO_DAYS('2024-08-01')),PARTITION p202408 VALUES LESS THAN (TO_DAYS('2024-09-01'))
);

方案 D:缓存层(Redis)

  • 原理:将热点查询结果缓存在内存中,减少数据库压力。
  • 实现:使用 Redis 哈希、Sorted Set 或自定义缓存策略。

示例:通过 Spring Cache 简单集成:

@Service
public class OrderService {@Cacheable(value = "orderList", key = "#userId")public List<Order> getRecentOrders(long userId) {return orderMapper.findByUserOrderByCreatedAt(userId, 20);}
}

各方案优缺点分析

| 方案 | 优点 | 缺点 | |------------|--------------------------------------------------------------|--------------------------------------------------------------| | 索引优化 | 最基础、低成本;即插即用;显著减少全表扫描 | 建索引占用空间;写入性能略有下降;对复杂查询提升有限 | | 查询重写 | 针对性强;可解决分页等特定问题 | 代码层复杂度上升;需分析不同场景重写策略 | | 分区/分表 | 支撑超大规模数据;单表/单库规模可控 | 设计和运维复杂;跨分区/跨库查询难;可能导致跨库事务问题 | | 缓存层 | 减少数据库压力;提升响应速度 | 缓存一致性、热点失效、二级缓存上下文复杂 |

选型建议与适用场景

  1. 数据量中等(百万级)且查询模式稳定:优先考虑 方案 A:索引优化方案 B:查询重写。低成本、风险小。
  2. 业务增长迅速、表数据量突破千万甚至亿级:结合 方案 C:分区表/分库分表。大型电商、日志系统等。
  3. 热点数据重复访问高:在以上方案基础上引入 方案 D:缓存层。防止缓存雪崩采用双层缓存或预热策略。
  4. 混合场景:可按业务模块拆分策略(OLTP 与 OLAP 分离),或采用 HTAP 数据库(如 TiDB)兼顾多种需求。

实际应用效果验证

场景:电商订单列表查询

  • 典型 SQL:按照用户查询、按下单时间倒序分页。
  • 初始数据:orders 表记录量 5000 万,按页码分页时 5000 页后响应时间超 2s。

优化前 EXPLAIN:

+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table  | type | possible_keys | key  | rows    | Extra                |
+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | orders | ALL  | NULL          | NULL | 50000000| Using filesort       |
+----+-------------+--------+------+---------------+------+---------+------+--------+-------------+
  • 方案 A 索引优化:新增 (user_id, created_at) 联合索引后,响应时间降至 200ms。
  • 方案 B 分页重写:基于 created_at 游标分页,5000 页查询 95% 都在 50ms 内完成。
  • 方案 C 分库分表:按用户哈希分 8 库后,最慢页响应 < 100ms。
  • 方案 D Redis 缓存:热点前 100 页结果均在 5ms 内返回。

综合来看,方案 A + 方案 B 是快速见效的低成本首选;方案 C + 方案 D 可结合应对超高并发与 PB 级数据量。


作者:匿名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87157.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87157.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/87157.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Terraform Helm:微服务基础设施即代码

&#x1f680; Terraform & Helm&#xff1a;微服务基础设施即代码 &#x1f4da; 目录 &#x1f680; Terraform & Helm&#xff1a;微服务基础设施即代码1. 引言 &#x1f680;2. 环境与依赖 &#x1f9f0;3. 架构示意 &#x1f3d7;️4. Terraform 定义云资源 &…

清理 Docker 缓存占用

Docker 缓存主要包括未使用的镜像、容器、卷和网络等资源。清理缓存可以提高磁盘空间&#xff0c;线上升级次数比较多的话&#xff0c;服务器中Docker缓存会非常严重&#xff0c;做下清理瘦身会有意想不到的效果 清理未使用的镜像 运行以下命令删除未被任何容器引用的镜像&…

深入解析NumPy的核心函数np.array()

深入解析NumPy的核心函数np.array NumPy与np.array()简介NumPy的重要性np.array()的作用 np.array()函数的详细参数object参数dtype参数copy参数order参数subok参数ndmin参数like参数 np.array()函数的使用示例创建基本的一维和二维数组创建具有特定数据类型的数组创建多维数组…

定时器的设计

定时器 定时器原理如何理解定时器定时器数据结构选取定时器触发方式 定时器的实现 定时器原理 如何理解定时器 定时器在日常通常被描述为组织大量延时任务的模块&#xff0c;其实从字面意思去理解的话&#xff0c;他就是去处理延时任务的&#xff0c;那么什么是延时任务呢&am…

大模型-分布式论文一瞥

1分离式架构 1.1 DistServe DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving 讲的是一个将prefill和decoding分…

02.SpringBoot常用Utils工具类详解

文章目录 1. BeanUtils详解1.1 什么是BeanUtils&#xff1f;1.2 主要的BeanUtils实现1.2.1 Spring BeanUtils1.2.2 Apache Commons BeanUtils1.2.3 其他实现 1.3 Spring BeanUtils详细使用1.3.1 基本用法1.3.2 指定忽略属性1.3.3 批量拷贝&#xff08;列表转换&#xff09; 1.4…

Golang快速开发框架——项目立项与系统配置读取组件viper(一)

Golang快速开发框架——项目立项与系统配置读取组件viper&#xff08;一&#xff09; 背景 知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录&#xff0c;将其整理出来以文章的形式分享给大家&#xff0c;来进行共同学习。欢迎大家进行持续关注。 知识分…

打造可观测的 iOS CICD 流程:调试、追踪与质量保障全记录

随着iOS项目复杂度增加&#xff0c;团队越来越依赖自动化构建、自动化测试等CI/CD流程来保证产品质量。但CI/CD环境下&#xff0c;很多线下调试手段无法直接使用&#xff0c;比如&#xff1a; 无法手动连真机跑Instruments测试包只在分发后才能拿到崩溃模拟器上表现和真机不一…

C++11中 <cinttypes>的入门与精通

文章目录 一、<cinttypes> 是什么1. 固定宽度的整数类型2. 整数操作函数3. 格式化输入输出宏 二、深入理解 <cinttypes>1. 固定宽度整数类型的使用2. 整数操作函数的使用3. 格式化输入输出宏的使用 三、实践和技巧1. 使用固定宽度整数类型的最佳实践2. 使用整数操作…

Pytorhc Lightning进阶:一篇实例玩转Pytorhc Lightning 让训练更高效

Pytorhc Lightning进阶&#xff1a;一篇实例玩转Pytorhc Lightning 让训练更高效 Pytorhc Lightning 主要包含以下几大类&#xff0c;主要围绕以下讲解&#xff1a; 模型&#xff0c;PyTorch Lightning 的核心是继承 pl.LightningModule数据&#xff0c;数据模块继承pl.Light…

大模型算法面试笔记——注意力Transformer流程/面试题篇

学习资料来源于字母站大学 1 Transformer架构 基于编码器-解码器的架构来处理序列对。跟使用注意力的seq2seq不同&#xff0c;Transformer是基于纯注意力。 2 注意力 2.1 自注意力机制 使用注意力&#xff1a;需要根据整个序列进行预测&#xff0c;对于同一input&#xf…

Rust 定义与实例化结构体

文章目录 Rust 定义与实例化结构体5.1 结构体的定义与意义5.2 结构体实例化5.2.1 基本实例化5.2.2 可变性规则5.2.3 字段初始化简写5.2.4 结构体更新语法 5.3 特殊结构体类型5.3.1 元组结构体&#xff08;Tuple Struct&#xff09;5.3.2 类单元结构体&#xff08;Unit-Like Str…

ELK日志分析系统(filebeat+logstash+elasticsearch+kibana)

一、ELK 平台介绍 1、ELK 概述 日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷&#xff0c;性能安全性&#xff0c;从而及时采取措施纠正错误。…

JS基础4—jQuery

jQuery常用内容 jQuery 介绍jQuery 获取方式基本选择器 (最常用)层级选择器 (基于元素间关系)过滤选择器 (基于特定条件) jQuery事件绑定jQuery 方法调用jQuery遍历jQuery 获取与设置jQuery 添加与删除jQuery CSS 类jQuery - AJAX 总结 jQuery 介绍 jQuery 是一个轻量级、快速…

时钟周期是什么?

时钟周期&#xff08;Clock Cycle&#xff09;是什么&#xff1f; 时钟周期&#xff08;Clock Cycle&#xff09;是计算机系统中一个最基础的时间单位&#xff0c;也称为时钟节拍或时钟周期时间&#xff08;Clock Period&#xff09;。它由系统时钟发生器产生的一个周期性脉冲…

如何用SEO优化长尾关键词?

内容概要 在SEO优化领域&#xff0c;长尾关键词扮演着至关重要的角色&#xff0c;它们能有效提升网站在搜索引擎中的可见度和流量转化率。本文将全面解析如何通过系统方法优化长尾关键词&#xff0c;涵盖从基础理论到实战应用的完整流程。核心内容包括利用专业工具进行关键词挖…

电子面单系统开发全解析

一、如果要做电子面单系统&#xff0c;怎么做&#xff1f; 开发电子面单系统是一项复杂且涉及多方面考量的工程&#xff0c;涵盖需求分析、系统架构设计、技术选型、接口对接、安全性保障、第三方服务选择以及部署与维护等关键环节。 电子面单系统开发步骤 需求分析&#xf…

UE5 - 制作《塞尔达传说》中林克的技能 - 18 - 磁力抓取器

让我们继续《塞尔达传说》中林克技能的制作!!! UE版本:5.6.0 VS版本:2022 本章节的核心目标:磁力抓取器 先让我们看一下完成后的效果: 18_磁力抓取器 大纲如下: 引言功能架构与核心逻辑物理材质与场景配置代码实现:从识别到操控操作说明1.引言 在《塞尔达传说》中,林…

基于ApachePOI实现百度POI分类快速导入PostgreSQL数据库实战

目录 前言 一、百度POI分类简介 1、数据表格 2、分类结构 二、从Excel导入到PG数据库 1、Excel解析流程 2、数据入库 3、入库成果及检索 三、总结 前言 在上一篇博文中&#xff0c;我们对高德POI分类进行了深入剖析 并对Excel 中 POI 分类数据的存储结构特点进行了详细介…

学习经验分享【41】YOLOv13:基于超图增强自适应视觉感知的实时目标检测

YOLO算法更新速度很快&#xff0c;已经出到V13版本&#xff0c;后续大家有想发论文或者搞项目可更新自己的baseline了。 摘要&#xff1a;YOLO 系列模型凭借其卓越的精度和计算效率&#xff0c;在实时目标检测领域占据主导地位。然而&#xff0c;YOLOv11 及早期版本的卷积架构&…