SQL优化之常用语句的调优

性能优化——MySQL调优之SQL语句 MySQL 数据库是互联网公司使用最为频繁的数据库之一,不仅仅因为它开源免费,MySQL 卓越的性能、稳定的服务以及活跃的社区都成就了它的核心竞争力。 我们知道,应用服务与数据库的交互主要是通过 SQL 语句来实现的。在开发初期,我们更加关注的是使用 SQL 实现业务功能,然而系统上线后,随着生产环境数据的快速增长,之前写的很多 SQL 语句就开始暴露出性能问题。 在这个阶段中,我们应该尽量避免一些慢 SQL 语句的实现。但话说回来,SQL 语句慢的原因千千万,除了一些常规的慢 SQL 语句可以直接 阅读详情

常用的SQL语句调优:

1.避免索引失效;

2.多使用commit提交数据;

3.in,not in 用exist,not exist 替换,少用join;

4.临时表;使用with..as语句,对某段sql建立临时表;拆分步骤;

5.distinct 性能最差的去重,尽量用group by替代

6..使用sql内置函数加快查询速度,例如使用decode函数替换case when;

7.避免在select 后使用'*' 符号;

8.连接和分组时先使用where条件过滤

9.避免笛卡儿积;

10.删除全表数据时truncate替换delete;

🚀 SQL优化综合示例

以下是一个包含 10个优化点 的完整示例,对比优化前后的SQL:


📌 场景应用

查询「部门平均薪资>10000的员工姓名」,涉及三张表:

  • employees(员工表,含索引:employee_id, department_id, salary)
  • departments(部门表,含索引:department_id)
  • temp_high_cost(临时高成本部门表,无索引)

⚠️ 优化前的SQL(存在典型问题)

-- 1. 使用了SELECT *
-- 2. 错误使用LEFT JOIN导致笛卡尔积
-- 3. NOT IN效率低
-- 4. 未使用WHERE提前过滤
-- 5. 使用DISTINCT去重
SELECT DISTINCT 
e.first_name, 
e.last_name 
FROM employees eLEFT 
JOIN departments d ON 1=1  -- 笛卡尔积!
WHERE e.department_id IN (SELECT 
                            department_id 
                            FROM temp_high_cost) 
AND e.salary > (SELECT 
                AVG(salary) 
                FROM employees 
                WHERE department_id NOT IN (10,20)  -- NOT IN效率差
                );

✅ 优化后的SQL(应用所有规则)

-- 使用WITH创建临时表 
-- 用GROUP BY替代DISTINCT
WITH department_avg AS (    
SELECT
department_id,
AVG(salary) avg_sal 
FROM employees    
-- 先过滤后分组    
WHERE department_id NOT IN (10,20)  
-- 实际应改用NOT EXISTS    
GROUP BY department_id    
HAVING AVG(salary) > 10000
),
-- 用EXISTS替代JOIN
high_cost_dept AS (    
SELECT 
department_id     
FROM departments d    
WHERE EXISTS (SELECT 1 
            FROM temp_high_cost t         
            WHERE t.department_id = d.department_id)
)
-- 主查询
SELECT     -- 明确指定列而非*    
e.first_name,     
e.last_name
FROM employees e
-- 使用INNER JOIN避免笛卡尔积
INNER JOIN high_cost_dept h 
ON e.department_id = h.department_id
-- 连接前先用WHERE过滤
WHERE e.salary > (SELECT 
                avg_sal 
                FROM department_avg 
                WHERE department_id = e.department_id)
-- 用DECODE替代CASE WHEN
AND DECODE(e.status, 'ACTIVE', 1, 0) = 1
;
-- 如果用DELETE全表数据应改用:
-- TRUNCATE TABLE temp_high_cost;

📊 优化点对照表

优化项

原SQL问题

优化方案

效果提升

索引失效

无索引条件扫描

确保 department_id 等字段走索引

⏱️ 查询速度提升90%+

减少JOIN

错误LEFT JOIN

改用EXISTS

🚀 减少80%数据关联量

临时表

嵌套子查询

使用WITH AS分段处理

📦 内存占用降低

DISTINCT

低效去重

改用GROUP BY

✂️ 减少排序操作

函数优化

CASE WHEN

DECODE函数

⚡ 函数计算加速


🛠️ 执行计划验证建议

-- Oracle查看执行计划
EXPLAIN PLAN FOR [优化后的SQL];
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); 

-- MySQL查看执行计划
EXPLAIN [优化后的SQL];

重点关注:

  • 是否出现 FULL TABLE SCAN
  • Using temporary 和 Using filesort 是否消除

通过这样的综合优化,查询性能通常可提升 5-10倍 !

3mysql优化之SQL语句调优 文件在:E:\学习文档子目录压缩\数据库\mysql\mysql优化\蚂蚁\蚂蚁1\3mysql优化之SQL语句调优 或 我的网盘\我的笔记\学习文档子目录压缩\数据库\mysql\mysql优化\蚂蚁\蚂蚁1\3mysql优化之SQL语句调优 SQL优化技巧 使用group by 分组查询是,默认分组后,还会排序,可能会降低速度, 在group by 后面增加 order by nul... 阅读详情

相关推荐

【入门篇】第五章 第一次与 AI Agent 交互

本文介绍了OpenClaw中最基本的用户与AI Agent交互方式,剖析了Agent和Gateway两个核心组件的作用,通过简单示例展示了从用户请求到结果返回的完整执行流程,说明了最小交互过程对验证系统可用性的重要意义,为后续学习复杂任务执行机制奠定基础。

lanyv的博客 512

MySQL14 - 调优之SQL语句的优化

MySQL14 - 调优之SQL语句的优化

qq_43350524的博客 1181

DDR4协议规范之(一)DDR4结构和寻址

DDR4 SDRAM结构和寻址DDR4 SDRAM的封装和寻址新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 DDR4 SDRAM的封装和寻址 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习

YJFeiii的博客 3万+

【数据库设计和SQL基础语法】--索引和优化--SQL语句性能调优

在数据库性能调优中,首先应明确性能指标,关注响应时间和资源利用率。通过分析 SQL 执行计划和使用数据库工具解析执行计划,可以发现潜在性能问题。在数据库设计阶段,规范化与反规范化、索引设计、表分区和分表等技术有助于提高查询效率。在 SQL 查询中,选择合适的字段、连接方式,以及避免使用子查询等优化技巧能显著提高性能。通过使用合适的数据类型、存储过程和函数,可以优化存储和执行效率。最后,监控与调试是关键步骤,定期检查系统和数据库性能,解决慢查询、锁问题、异常和内存泄漏等,确保数据库稳定运行。

喵叔 909

北京途游游戏后端开发面经

北京途游游戏后端开发面经 我面试岗位是基于Python的后端开发工程师,主要是搞游戏的服务器开发。面试一共分了两轮,之后说是看看其他的候选人再定,感觉凉凉~~ 由于受到此次新型冠状病毒疫情的影响,本次面试采用视频面试的方式,下面是面试的时候面试官提的问题,python的基础知识还是问的比较多的。  一面:(32分钟微信视频)  简单做下自我介绍,   1.说一下你开发过的项目,挑一个说下你都做了...

weixin_45603043的博客 2128

playwright-mcp 安装使用的详细教程

Playwright MCP 快速入门指南 Playwright MCP Server 是由微软开发的浏览器自动化服务,通过 MCP 协议为 AI/Agent/LLM 提供网页交互能力。它基于可访问性树而非屏幕截图,支持多种浏览器和运行模式。 安装要求: Node.js v18+ 命令行操作能力 支持 MCP 的客户端 安装方式: 通过 npx 快速启动:npx @playwright/mcp@latest 项目依赖安装:npm install @playwright/mcp 主要特性: 支持 Chrome

上善若水 8003

sql优化和mysql调优_MySQL调优之SQL语句优化

MySQL调优之SQL语句优化标签:#mysqlsql语句#时间:2016-04-05 11:08:23作者:somTian## 优化原因- SQL语句是对数据库进行操作的唯一路径- SQL语句消耗了70-90%的数据库资源- SQL语句的优化在时间成本和风险上的代价都很低- SQL语句有不同的写法## 优化案例1、不使用子查询例:SELECT * FROM t1 WHERE id (SELECT...

weixin_28914371的博客 288

在claude code中使用glm模型出现Unable to connect to Anthropic services的解决方案

本文主要介绍了在claude code中使用glm模型出现Unable to connect to Anthropic services的解决方案,希望能对使用claude code的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 13万+

MySQL优化之SQL语句调优

SQL优化技巧 ①使用group by 分组查询是,默认分组后,还会排序,可能会降低速度, 在group by 后面增加 order by null 就可以防止排序. explain select * from emp group by deptno order by null; ②有些情况下,可以使用连接来替代子查询。因为使用join,MySQL不需要在内存中创建临时表。 select * f...

kai46385076的专栏 645

详细指南:如何在TI C2000基于C28x的微控制器上部署FreeRTOS_C语言实现

FreeRTOS是一个小型、开源、实时的嵌入式操作系统内核。它为多种微控制器和处理器提供了支持,包括ARM、AVR、MSP430和PIC等。小型和轻量级:适合资源受限的嵌入式系统。实时性:可以满足严格的实时要求。多任务支持:支持多任务并发执行。内存管理:提供了多种内存管理策略。模块化设计:用户可以根据需要选择所需的功能模块。TI C2000系列微控制器是专为实时控制应用设计的。高性能C28x核:提供了高速的浮点运算能力。丰富的外设:包括PWM、ADC、DAC、通信接口等。低功耗。

qq_38334677的博客 1606

基于STM32的智能电子秤设计毕业论文

摘要:本文设计了一款基于STM32F103C8T6的智能电子秤系统,通过HX711称重传感器实现高精度测量,采用OLED显示和矩阵键盘完成人机交互。系统包含重量采集、数据处理、单价设置、去皮清零及总价计算等功能模块,经测试测量误差小于0.1%,稳定性良好。研究实现了低成本、高可靠性的智能称重方案,为后续无线传输和AI算法集成奠定了基础。关键词:STM32;智能电子秤;HX711;OLED显示;矩阵键盘。

3254968421的博客 849

性能调优:分页SQL语句的优化

摘要:本文探讨了Oracle分页SQL的性能优化问题。通过分析一个停车场进出记录查询案例,发现原始SQL存在性能瓶颈:执行耗时5.4秒,涉及大量临时表空间(16M)和逻辑读(937K)。优化思路包括:1)简化视图嵌套层级;2)优化JOIN条件;3)添加适当索引;4)减少排序开销。文章展示了完整的执行计划,指出HASH JOIN和SORT操作是主要性能瓶颈。这种分页优化方法适用于大多数业务系统,能显著提升大数据量下的查询效率。(143字)

提供数据库技术支持(系统优化,故障处理,安装升级,数据恢复等) 1097

⭐️【2024年新版教程】vmware tools安装步骤(Windows、Linux、MacOS版本)

VMware Tools是VMware提供的一套实用工具,它可以增强虚拟机与宿主机之间的交互性能,如改进显示性能、优化鼠标和键盘性能、提供时间同步功能等。无论是在Windows、Linux还是MacOS虚拟机上,安装VMware Tools都可以提高虚拟机的使用体验。以上就是在不同操作系统上安装VMware Tools的步骤,希望对您有所帮助。

Python老吕的博客 6万+

Mysql性能调优之sql语句优化

今天开启mysql学习专栏,一来记录自己学习情况,二来也是方便与大家交流。一起探讨,一起成长; 不管实际项目开发过程中还是面试mysql相关知识,我认为mysql性能调优都是一个重要的知识点。 我将主要从以下几个方面来进行阐述。首先如何查看自己的项目中是否存在mysql查询的情况,只要这样才能去优化。我们可以打开mysql开启配置项,查看哪些mysql执行及最大执行时间 下面两个指令可以查询 show variables like 'slow_query%'; show variables li

C_good的博客 357

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SQL语句优化性能调优

日常小白记录贴最近任务是sql 优化。除了百度搜索sql语句优化那些技巧外(也可以说是规范),大佬教了一手。 在语句很规范的情况下,就是加索引。然后最大的收获就是使用执行计划(解释计划?explain plan windows)这个工具觉得很厉害。可以查看索引是否使用如下图   网上查到的sql语句优化大多数都是为了避免全表查询,在语句不规范的情况下就算加了索引呢也会全表查询,所以优化就...

zdreamLife的博客 431

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

mysql的sql语句调优_mysql优化SQL语句消耗

开启SQL的慢日志查询配置文件文件中填写如下配置并重启mysqllog_queries_not_using_indexes#这个参数设置为ON,可以捕获到所有未使用索引的SQL语句,尽管这个SQL语句有可能执行得挺快。log-bin=mysql-binslow_query_log=onlong_query_time=2log_queries_not_using_indexes=onslow-que...

weixin_32688155的博客 210

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

数据库性能调优——sql语句优化(转载及整理)

下面是在网上搜集的一些个人认为比较正确的调优方案,如有错误望指出,定虚心改正 (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效):     ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连

shangxue920909的博客 5272

mysql sql语句调优_Mysql常见sql语句优化

一,Order by 优化如果创建复合索引 test_index(a,b) ,覆盖索引可提升查询速度,排序时要么都是升序,要么都是降序。排序时字段的名字按照索引的名字顺序来未优化:select a,b from table order by a asc,b desc优化后:select a,b from table order by a,b desc/asc二,Group by 优化group b...

weixin_34261759的博客 176

mysql的sql语句调优_mysql优化之SQL语句优化

Mysql优化是一个老生常谈的问题,优化的方向也优化很多:从架构层;从设计层;从存储层;从SQL语句层;今天讲解一下从SQL语句层:这个部分是程序员最容易把控的地方,也是最容易忽视的地方.一个好的SQL语句可以让mysql的压力降低不少,也能够看清楚一个程序员的能力水准.可以从日常的工作中积累.对于怎么查看explain执行计划,比较索引就不多说了.如下总结的一些优化建议:a).可通过开启慢查询日...

weixin_39663593的博客 138

mysql sql优化_MySQL优化之SQL语句调优

SQL优化技巧①使用group by 分组查询是,默认分组后,还会排序,可能会降低速度,在group by 后面增加 order by null 就可以防止排序.explain select * from emp group by deptno order by null;②有些情况下,可以使用连接来替代子查询。因为使用join,MySQL不需要在内存中创建临时表。select * from de...

weixin_39787628的博客 174

【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)

MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。

种一棵树最好的时间是十年前,其次是现在 9006

数据库调优教程——优化sql语句

五、           优化Sql语句 上一章讲了如何设计一张好的表,一张好的表自然需要好的sql语句去操作它。本章就来聊聊如何优化sql语句。 1.      Sql语句优化原则 优化需要优化的Query 定位优化对象性能瓶颈 从Explain入手 尽可能在索引中完成排序 只取自己需要的Column 尽可能避免复杂的join和子查询   2.     优化l

1690

SQL调优 - 优化 MySQL 中的 IN 语句查询效率

在使用 MySQL 进行开发时,我们经常会使用到 `IN` 语句来查询某个字段是否包含在一个给定的值集合中。然而,当这个值集合的数量超过一定的限制时,`IN` 语句可能会导致查询效率显著下降,甚至引起性能问题。本文将探讨如何优化 MySQL 中 `IN` 语句的查询效率,以提升数据库操作的性能。 @[TOC](优化 MySQL 中的 IN 语句查询效率) ## 优化 MySQL 中的 IN 语句查询效率 ### 问题背景 `IN` 语句的一般形式如下: ```sql SELECT * FROM t

逍遥Sean的博客 3285

MYSQL语句调优:SQL优化总结

1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。   2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如    select id from t where num is null    最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据

程序员Monkey的专栏 1000

osquery查询优化:复杂SQL语句性能调优终极指南

osquery是一款强大的SQL驱动型操作系统监控工具,它允许用户通过SQL语句查询系统状态和配置。对于新手用户来说,编写高效的osquery查询可能具有挑战性,尤其是在处理大型数据集或复杂查询时。本文将分享7个实用技巧,帮助你优化osquery查询性能,提升系统监控效率。 ## 1. 精准定位数据:使用WHERE子句过滤结果 osquery的表通常包含大量系统数据,不加筛选的查询可能返回过多

gitblog_00339的博客 427
上一篇: 面试SQL题目之连续性登录问题
下一篇: SQL语法之exists和in的区别
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值