数据库性能杀手与调优实践
目录
- 前言
- 一、索引缺失引发的全表扫描灾难
- 1.现象与影响
- 2.优化策略
- 二、SELECT * 的隐性成本
- 1.危害分析
- 2.优化实践
- 三、分页查询的性能陷阱
- 1.深度分页问题
- 2.优化方案对比
- 四、执行计划分析方法论
- 1.关键指标解读
- 2.典型劣化模式识别
- 五、综合优化最佳实践
- 总结
前言
在数据库应用开发中,低效的SQL语句常导致系统性能急剧下降。据Gartner统计,80%的数据库性能问题源于未优化的SQL语句设计。本文将深入解析典型低效SQL的成因,并提供系统化的优化方案。
🌟 关于我 | 李工👨💻
深耕代码世界的工程师 | 用技术解构复杂问题 | 开发+教学双重角色
🚀 为什么访问我的个人知识库?
👉 https://cclee.flowus.cn/
✨ 更快的更新 - 抢先获取未公开的技术实战笔记
✨ 沉浸式阅读 - 自适应模式/代码片段一键复制
✨ 扩展资源库 - 附赠 「编程资源」 + 「各种工具包」
🌌 这里不仅是博客 → 更是我的 编程人生全景图🌐
从算法到架构,从开源贡献到技术哲学,欢迎探索我的立体知识库!
一、索引缺失引发的全表扫描灾难
1.现象与影响
-
全表扫描:当查询条件字段无索引时,数据库引擎需遍历所有数据页,时间复杂度O(n)
-
性能损耗:百万级数据表单次扫描可能消耗数百毫秒,高并发场景下易引发雪崩效应
2.优化策略
-
索引创建原则
-- 示例:在订单状态与创建时间建立复合索引 CREATE INDEX idx_order_status_time ON orders (status, created_at);
-
索引类型选择
-
B+Tree索引:适用于范围查询(如时间区间)
-
Hash索引:适用于等值查询(如状态枚举值)
-
覆盖索引:将查询字段直接包含在索引中
-
-
索引管理规范
-
定期分析索引使用率(MySQL的
information_schema
,PostgreSQL的pg_stat_user_indexes
) -
删除冗余索引(如单列索引与前缀重复的复合索引)
-
二、SELECT * 的隐性成本
1.危害分析
-
数据传输膨胀:假设表有10个
VARCHAR(1000)
字段,单条记录传输量达10KB -
缓冲池污染:不必要的大字段(如
TEXT
)会挤占Buffer Pool有效缓存空间 -
执行计划劣化:可能导致优化器放弃使用覆盖索引
2.优化实践
-- 反例
SELECT * FROM user_logins WHERE user_id = 1001;-- 正例:仅获取必要字段
SELECT login_time, ip_address FROM user_logins WHERE user_id = 1001;
进阶优化:对大表查询使用EXPLAIN
验证执行计划是否命中索引
EXPLAIN SELECT username FROM users WHERE last_login > '2024-01-01';
三、分页查询的性能陷阱
1.深度分页问题
传统LIMIT offset, size
在偏移量极大时(如LIMIT 1000000, 10
),需扫描大量废弃数据。
2.优化方案对比
方案 | 时间复杂度 | 适用场景 | 示例 |
---|---|---|---|
基于WHERE条件 | O(log n) | 有序数据集 | WHERE id > 1000 LIMIT 10 |
延迟关联 | O(log n) + O(k) | 宽表查询 | 先通过子查询获取主键 |
游标分页 | O(1) | 实时数据 | 使用Redis记录游标位置 |
延迟关联优化示例:
-- 原始低效查询
SELECT * FROM orders WHERE customer_id = 1001 LIMIT 10000, 10;-- 优化后
SELECT * FROM orders
WHERE order_id IN (SELECT order_id FROM orders WHERE customer_id = 1001 LIMIT 10000, 10
);
四、执行计划分析方法论
1.关键指标解读
EXPLAIN SELECT name FROM products WHERE price > 1000;
列名 | 优化关注点 |
---|---|
type | 保证达到range级别以上 |
key | 显示实际使用的索引 |
rows | 预估扫描行数 |
Extra | 避免出现Using filesort |
2.典型劣化模式识别
-
Using temporary
:需要创建临时表(常出现在GROUP BY
优化) -
Using filesort
:排序未使用索引(考虑创建排序复合索引) -
Impossible WHERE
:逻辑矛盾的查询条件
五、综合优化最佳实践
-
查询设计阶段
-
避免在
WHERE
子句中对字段进行运算或函数操作 -
用
EXISTS
替代IN
子查询(MySQL 8.0+优化器已改进,但仍有差异)
-
-
索引优化矩阵
查询模式 | 推荐索引结构 |
---|---|
单等值查询 | 单列索引 |
多条件组合查询 | 覆盖索引 |
排序+分页 | 联合索引(排序字段前置) |
-
监控与调优工具
-
MySQL:Slow Query Log + pt-query-digest
-
PostgreSQL:pgBadger
-
通用:数据库性能视图(V$SQL等)
-
总结
SQL优化是一项需要持续迭代的工作。某电商系统通过上述优化策略,将QPS从120提升至850,DB负载下降73%。建议建立SQL审核机制,在开发阶段即介入优化,结合自动化工具实现性能基线管控。
数据库性能优化本质是平衡存储IO、CPU计算和网络传输的开销。理解数据分布特征,选择合适的数据访问路径,才能构建高性能的数据库应用。
相关文章:
数据库性能杀手与调优实践
目录 前言一、索引缺失引发的全表扫描灾难1.现象与影响2.优化策略 二、SELECT * 的隐性成本1.危害分析2.优化实践 三、分页查询的性能陷阱1.深度分页问题2.优化方案对比 四、执行计划分析方法论1.关键指标解读2.典型劣化模式识别 五、综合优化最佳实践总结 前言 在数据库应用开…...
初始化列表详解
1.类中包含以下成员,必须放在初始化列表位置进行初始化: 1. 引用成员变量 2.const成员变量 3. 自定义类型成员(且该类没有默认构造函数时 ) 2. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关…...
【CVE-2025-1094】:PostgreSQL 14.15 SQL注入漏洞导致的RCE_ 利用代码和分析
目标 PostgreSQL 14.15BeyondTrust Privileged Remote Access (PRA) 和 Remote Support (RS) 软件受影响的版本:使用PostgreSQL 14.15及其版本的BeyondTrust产品Explain CVE-2025-1094 是 PostgreSQL 14.15 版本的 psql 交互式工具中发现的 SQL 注入漏洞。由于输入值的验证不…...
【验证技能】VIP项目大总结
VIP项目快做一段落了,历时一年半,也该要一个大汇总。 VIP简介 VIP开发流程 VIP难点 进程同步 打拍插入不同bit位宽数据问题。 动态升降lane VIP做的不好的地方和改进想法 各层之间交互 testsuite两端关键 所有层的实现架构不统一 VIP经验 ** 架构…...
MyBatis 参数处理全解析
在 Java 开发领域,MyBatis 作为一款优秀的持久层框架,凭借其简洁的设计和强大的功能,受到了广大开发者的青睐。而参数处理作为 MyBatis 中一个至关重要的环节,掌握好它能让我们更高效地使用 MyBatis 进行数据库操作。本文将全面深…...
【自然语言处理与大模型】使用Xtuner进行QLoRA微调实操
本文首先对Xtuner这一微调框架进行简单的介绍。手把手演示如何使用Xtuner对模型进行微调训练,包括数据准备、训练命令执行及训练过程中的监控技巧。最后,在完成微调之后,本文还将介绍如何对微调结果进行简单对话测试。 一、Xtuner微调框架 X…...
2023华为od统一考试B卷【二叉树中序遍历】
前言 博主刷的华为机考题,代码仅供参考,因为没有后台数据,可能有没考虑到的情况 如果感觉对你有帮助,请点点关注点点赞吧,谢谢你! 题目描述 思路 0.用Character数组存储树,index下标的左右…...
Midjourney 绘画 + AI 配音:组合玩法打造爆款短视频!
一、引言:AI 重构短视频创作范式 在某短视频工作室的深夜剪辑室里,资深编导正在为一条古风剧情视频发愁:预算有限无法实拍敦煌场景,人工绘制分镜耗时 3 天,配音演员档期排到一周后。而使用 Midjourney 生成敦煌壁画风格的场景图仅需 15 分钟,AI 配音工具实时生成多角色台…...
敏感词 v0.25.1 新特性之返回匹配词,修正 tags 标签
开源项目 敏感词核心 https://github.com/houbb/sensitive-word 敏感词控台 https://github.com/houbb/sensitive-word-admin 版本特性 大家好,我是老马。 敏感词以前在实现的时候,没有返回底层实际匹配的词,有时候问题排查非常耗费时间。 …...
【多线程】六、基于阻塞队列的生产者消费者模型
文章目录 Ⅰ. 生产者消费者模型的概念Ⅱ. 生产者消费者模型的优点Ⅲ. 基于阻塞队列的生产者消费者模型MakefileBlock_queue.hpptask.hpptest.cppⅣ. 如何理解提高了效率❓❓❓Ⅰ. 生产者消费者模型的概念 生产者消费者模型是一种常见的并发模式,用于解决生产者和消费者之间…...
解决Flutter项目中Gradle构建Running Gradle task ‘assembleDebug‘卡顿问题的终极指南
解决Flutter项目中Gradle构建Running Gradle task ‘assembleDebug‘卡顿问题的终极指南 前言 在开发Flutter应用时,经常会遇到Gradle构建卡在Running Gradle task assembleDebug阶段的问题。本文将分享如何通过配置华为云镜像和使用自定义脚本下载依赖的方法解决这些问题。…...
IntelliJ IDEA 保姆级使用教程
文章目录 一、创建项目二、创建模块三、创建包四、创建类五、编写代码六、运行代码注意 七、IDEA 常见设置1、主题2、字体3、背景色 八、IDEA 常用快捷键九、IDEA 常见操作9.1、类操作9.1.1、删除类文件9.1.2、修改类名称注意 9.2、模块操作9.2.1、修改模块名快速查看 9.2.2、导…...
从此,K8S入门0门槛!
前言 当你想要入门K8S的时候,往往会被各种概念搞的晕乎乎的,什么API Server,Scheduler,Controller manager,Etcd,Pod,Kubelet,kube-proxy,deployment…… 哪怕你使用了…...
vue2和vue3组件如何监听子组件生命周期
在 Vue 中监听子组件的生命周期是一个常见需求,但 Vue 官方并不直接推荐这么做,因为这会打破组件的封装性。但在**一些特定场景(如自动化监控、封装逻辑复用)**下仍是有意义的。 下面分别讲解 Vue 2 和 Vue 3 中如何监听 子组件的…...
如何用Python绘制两个圆之间的8条公切线
引言 在几何学中,两圆之间存在多种类型的公共切线。本文将通过Python代码演示如何绘制两个同心圆(半径分别为1.0和3.0)之间的8条公切线,并解释相关数学原理与代码实现细节。 环境准备 import matplotlib.pyplot as plt import …...
会话历史管理——持久化
需求场景推荐方案理由中小企业级应用,需复杂查询MySQL/PostgreSQL事务支持完善,开发成本低海量数据高并发写入Cassandra水平扩展性强,写入性能高非结构化历史数据快速检索MongoDB灵活存储,内置全文检索本…...
C++之IO流
目录 一、C语言的输入与输出 二、流是什么 三、CIO流 3.1、C标准IO流 3.2、C文件IO流 四、stringstream的简单介绍 一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放…...
maven install时报错:【无效的目标发行版: 17】
在很多次运行项目前的maven install时,我总是遇到无效的目标发行版: 17的问题,解决过之后就又忘了怎么解决,浪费了很多时间。。 今天把他总结一下,如图报错: 解决方法 注意: 如果只想解决这个项目的问题…...
开闭原则(OCP)
非常棒的问题!🔍 开闭原则(OCP, Open/Closed Principle)是软件设计的核心原则之一,下面我将从定义、意义、优劣分析、Python示例和结构图五个方面完整解析给你。 🧠 什么是开闭原则? 开闭原则&a…...
FHQ Treap
按值分裂 /* 按值x分裂Treap:将树u分裂为<x的树l和>x的树r */ void split(int u, int x, int& l, int& r) {if (!u) { l r 0; return; } // 空树直接返回if (t[u].val < x) { // 当前节点值<x,应放入左树l u; …...
题解传送门
做个算法分类,这样找特定算法的题目就方便多了23333 竞赛工具 【竞赛工具】——sublime text4 xcpc竞赛向配置教程 【竞赛工具】——vscode xcpc竞赛向配置教程 算法讲解 [算法学习]——通过RMQ与dfs序实现O(1)求LCA(含封装板子) [算法…...
ASP.NET MVC 入门与提高指南七
39. 量子安全通信与 MVC 应用保障 39.1 量子安全通信概念 量子安全通信基于量子力学原理,利用量子态的特性(如量子纠缠、量子不可克隆定理)来实现信息的安全传输。与传统加密方式相比,量子安全通信能够提供更高的安全性…...
Linux工作台文件操作命令全流程解析
全文目录 1 确认当前工作路径2 导航与目录管理2.1 关键命令2.2 逻辑衔接 3 文件基础操作3.1 创建 → 备份 → 重命名 → 清理3.2 文件查看和编辑3.3 文件链接3.4 文件diff 4 文件权限与所有权管理5 文件打包与归档6 参考文献 写在前面 shell是一种命令解释器,它提供…...
03 - spring security自定义登出页面
spring security自定义登出页面 文档 00 - spring security框架使用01 - spring security自定义登录页面02 - spring security基于配置文件及内存的账号密码 自定义登出页面 调整配置类WebSecurityConfig.java package xin.yangshuai.springsecurity03.config;import org.…...
unity webgl netbox2本地部署打开运行
unity webgl netbox2本地部署打开运行 复制NetBox2.exe和index.html 在同一级目录下使用,双击netbox2.exe。 下载文件 下载地址: netbox2.exe...
华为OD机试真题 Java 实现【水库蓄水问题】
前言 博主刷的华为机考题,代码仅供参考,因为没有后台数据,可能有没考虑到的情况 如果感觉对你有帮助,请点点关注点点赞吧,谢谢你! 题目描述 思路 1. 其实就是找一个最大的水坑,两个…...
A2A 协议与 MCP 协议:智能代理生态系统的双轮驱动
本文将探讨A2A 协议与MCP 协议的特点、区别及协同作用,帮助开发者和产品设计师更好地理解这一新兴技术领域。 A2A 协议:打造代理间的沟通桥梁 A2A 协议的核心概念 A2A 协议是由 Google 与 50 多家行业合作伙伴共同开发的开放协议,旨在实现…...
使用AI-01开发板和开源后端服务搭建整套小智服务系统
使用AI-01开发板和开源后端服务搭建整套小智服务系统 四博智联的AI-01开发板,基于乐鑫ESP32-C2 专属定制的离线语音模组,能够完美的接入小智AI服务平台,再使用开源后端服务,就能够搭建一个完整的小智AI服务系统了。 下面是具体…...
第三章 权限维持-linux权限维持-隐藏
简介 ssh rootenv.xj.edisec.net -p 密码 xjqxwcyc 1.黑客隐藏的隐藏的文件 完整路径md5 2.黑客隐藏的文件反弹shell的ip端口 {ip:port} 3.黑客提权所用的命令 完整路径的md5 flag{md5} 4.黑客尝试注入恶意代码的工具完整路径md5 5.使用命令运行 ./x.xx 执行该文件 将查询的…...
Linux操作系统系统编程:x86-64架构下的系统调用
在Linux操作系统里,系统编程如同精密仪器的核心部件,掌控着系统运行的关键。而 x86-64 架构下的系统调用,更是连接用户空间程序与内核的关键桥梁。你可以把用户空间的程序想象成一个个 “工匠”,它们有着各式各样的需求࿰…...
linux下如何在一个录目中将一个文件复制到另一个录目,删除目录
一.文件复制到另一个目录 在Linux系统中,要将一个文件从一个目录复制到另一个目录,你可以使用cp命令。下面是一些基本的用法: 1. 使用绝对路径 如果你知道文件的绝对路径和目标目录的绝对路径,你可以直接使用cp命令。例如&…...
用Selenium开启自动化网页交互与数据抓取之旅
用Selenium开启自动化网页交互与数据抓取之旅 在当今数字化时代,数据的价值不言而喻,而网页作为海量数据的重要载体,如何高效获取其中的关键信息成为众多开发者和数据爱好者关注的焦点。Selenium这一强大工具,为我们打开了自动化…...
RabbitMQ的交换机
一、三种交换机模式 核心区别对比 特性广播模式(Fanout)路由模式(Direct)主题模式(Topic)路由规则无条件复制到所有绑定队列精确匹配 Routing Key通配符匹配…...
多模态大语言模型arxiv论文略读(五十五)
MoMA: Multimodal LLM Adapter for Fast Personalized Image Generation ➡️ 论文标题:MoMA: Multimodal LLM Adapter for Fast Personalized Image Generation ➡️ 论文作者:Kunpeng Song, Yizhe Zhu, Bingchen Liu, Qing Yan, Ahmed Elgammal, Xiao…...
TMI投稿指南(四):投稿相关网址
TMI官网:https://ieeetmi.org/ 模版选择器:选择合适的latex模版 IEEE-Template Selector 评审过程状态查看:ScholarOne Manuscripts AE assigns reviewers:副编辑已经开始选择和邀请审稿人,但同意审稿…...
Oracle无法正常OPEN(三)
在Oracle数据库中,如果几个数据文件丢失,导致数据库无法启动,报错“ORA-01157: cannot identify/lock data file 2 - see DBWR trace file”,如果没有物理备份的情况下,位于丢失数据文件的数据是无法找回的,…...
SQL语句练习 自学SQL网 在查询中使用表达式 统计
目录 Day 9 在查询中使用表达式 Day 10 在查询中进行统计 聚合函数 Day 11 在查询中进行统计 HAVING关键字 Day12 查询执行顺序 Day 9 在查询中使用表达式 SELECT id , Title , (International_salesDomestic_sales)/1000000 AS International_sales FROM moviesLEFT JOIN …...
当LLM遇上Agent:AI三大流派的“复仇者联盟”
你一定听说过ChatGPT和DeepSeek,也知道它们背后的LLM(大语言模型)有多牛——能写诗、写代码、甚至假装人类。但如果你以为这就是AI的极限,那你就too young too simple了! 最近,**Agent(智能体&a…...
模拟开发授权平台
这次只是实现应用的curd和公私钥的校验以及第三方的通知dmeo项目,大家可以拓开视野来编写 进入主题 项目链接:桌角的眼镜/develop_auth_platform 直接下拉并运行就行 回调应用代码在test包中 回调应用测试代码 package mainimport ("encoding/…...
python数据分析(八):Pandas 文本数据处理
Pandas 文本数据处理全面指南 1. 引言 在数据分析中,文本数据是常见的数据类型之一。Pandas 提供了强大的字符串处理方法,可以方便地对文本数据进行各种操作。本文将详细介绍 Pandas 中的文本处理功能,包括字符串连接(cat)、分割(split)、替…...
Spring AI:简化人工智能功能应用程序开发
Spring AI:简化人工智能功能应用程序开发 一、项目简介 Spring AI 项目致力于简化包含人工智能功能的应用程序的开发工作,并且不会引入不必要的复杂性。该项目从著名的 Python 项目(如 LangChain 和 LlamaIndex)中获取灵感&#…...
【算法基础】三指针排序算法 - JAVA
一、基础概念 1.1 什么是三指针排序 三指针排序是一种特殊的分区排序算法,通过使用三个指针同时操作数组,将元素按照特定规则进行分类和排序。这种算法在处理包含有限种类值的数组时表现出色,最经典的应用是荷兰国旗问题(Dutch …...
从实列中学习linux shell9 如何确认 服务器反应迟钝是因为cpu还是 硬盘io 到底是那个程序引起的。cpu负载多高算高
在 Linux 系统中,Load Average(平均负载) 是衡量系统整体压力的关键指标,但它本身没有绝对的“高/低”阈值,需要结合 CPU 核心数 和 其他性能指标 综合分析。以下是具体判断方法: 一、Load Average 的基本含义 定义:Load Average 表示 单位时间内处于可运行状态(R)和不…...
[面试]SoC验证工程师面试常见问题(三)
SoC验证工程师面试常见问题(三) 在 SoC 验证工程师的面试中,面试官可能会要求候选人现场编写 SystemVerilog、UVM (Universal Verification Methodology) 或 SystemC 代码,以评估其编程能力、语言掌握程度以及解决实际验证问题的能力。这种随机抽题写代码的环节通常…...
架构进阶:深入学习企业总体架构规划(Oracle 战略专家培训课件)【附全文阅读】
本文主要讨论了企业总体技术架构规划的重要性与实施建议。针对Oracle战略专家培训课件中的内容,文章强调了行业面临的挑战及现状分析、总体技术架构探讨、SOA集成解决方案讨论与问题解答等方面。文章指出,为了消除信息孤岛、强化应用系统,需要…...
stm32教程:软件I2C通信协议 代码模板提供
早上好啊大伙,这一期也是stm32的基础教学,这一期说的是 —— I2C通信协议。 文章目录 一、I2C协议概述二、物理层特性硬件结构速率模式 三、协议层机制起始与停止信号数据帧结构应答机制时钟同步与仲裁 四、通信协议1. 起始信号(START Condit…...
Java零基础入门Day4:数组与二维数组详解
一、为什么需要数组? 当程序需要处理批量同类型数据时,使用多个变量存储会非常繁琐。例如存储70个学生姓名时,需定义70个变量,而数组可以简化这一过程,提高代码可维护性。 示例:变量存储的弊端 String n…...
一条 SQL 查询语句是如何执行的(MySQL)
第一讲:一条 SQL 查询语句是如何执行的 总览图示 MySQL 查询的执行流程可以大致分为以下步骤(如图所示): 连接器(Connection)查询缓存(Query Cache,MySQL 8.0 已废弃)…...
IntelliJ IDEA
文章目录 一、集成开发环境(IDE, Integrated Development Environment)二、IntelliJ IDEAIDEA 安装 三、IDEA 管理 Java 程序的结构四、IDEA 开发 HelloWorld 程序 一、集成开发环境(IDE, Integrated Development Environment) 把代码编写,编译,执行等多…...
详细说明StandardCopyOption.REPLACE_EXISTING参数的作用和使用方法
StandardCopyOption.REPLACE_EXISTING 是 Java java.nio.file.StandardCopyOption 枚举类中的一个常量,它主要用于在文件复制或移动操作中处理目标文件已存在的情况。下面详细介绍其作用和使用方法。 作用 在使用 java.nio.file.Files 类的 copy() 或 move() 方法时…...