SQL 复杂查询和性能优化

一、掌握复杂查询的核心技能

1. ​理解 SQL 执行顺序
  • SQL 语句的逻辑执行顺序(非书写顺序):
    FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT
  • 关键点:每一步的结果会传递给下一步,影响优化逻辑。
2. ​多表连接(JOIN)​
  • 类型
    • INNER JOIN(默认)
    • LEFT/RIGHT JOIN
    • FULL OUTER JOIN(部分数据库不支持)
    • CROSS JOIN(笛卡尔积)
  • 示例
    SELECT u.name, o.order_id
    FROM users u
    LEFT JOIN orders o ON u.id = o.user_id
    WHERE o.amount > 100;
3. ​子查询与 CTE
  • 子查询
    SELECT name FROM users
    WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);
  • CTE(公共表表达式)​
    WITH high_value_orders AS (SELECT user_id FROM orders WHERE amount > 100
    )
    SELECT u.name FROM users u
    JOIN high_value_orders hvo ON u.id = hvo.user_id;
  • 优势:CTE 可读性更好,支持递归查询。
4. ​窗口函数
  • 用途:在结果集的子集上计算聚合(不折叠行)。
  • 示例
    SELECT name, salary,RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
    FROM employees;
  • 常用函数
    • ROW_NUMBER()RANK()DENSE_RANK()
    • LEAD()LAG()
    • SUM() OVER (PARTITION BY ...)
5. ​复杂条件与 CASE 语句
  • 动态分类
    SELECT name,CASE WHEN salary > 10000 THEN 'High'WHEN salary > 5000 THEN 'Medium'ELSE 'Low' END AS salary_level
    FROM employees;

二、性能优化核心技巧

1. ​分析执行计划
  • 使用 EXPLAIN
    EXPLAIN SELECT * FROM users WHERE email = 'user@example.com';
  • 关键指标
    • Full Table Scan(全表扫描)→ 需要避免。
    • Index Scan(索引扫描)→ 理想情况。
    • Rows Removed by Filter → 过滤效率。
2. ​索引优化
  • 何时使用索引
    • 频繁作为查询条件的列(WHERE、JOIN、ORDER BY)。
    • 高选择性的列(唯一值多,如用户ID)。
  • 索引类型
    • 单列索引、复合索引、唯一索引、覆盖索引。
  • 复合索引设计
    • 将最常用的列放在前面。
    • 示例:INDEX (country, city) 可优化 WHERE country='US' AND city='NY'
3. ​避免全表扫描
  • 反例
    SELECT * FROM users WHERE YEAR(created_at) = 2023; -- 无法使用 created_at 的索引
  • 优化
    SELECT * FROM users
    WHERE created_at BETWEEN '2023-01-01' AND '2023-12-31';
4. ​分页优化
  • 低效写法
    SELECT * FROM users LIMIT 1000000, 10; -- 扫描前 100 万行
  • 优化
    SELECT * FROM users WHERE id > 1000000 ORDER BY id LIMIT 10;
5. ​减少数据传输量
  • 避免 SELECT *
    SELECT id, name FROM users; -- 只取必要字段
  • 分批次处理
    -- 使用 WHERE 条件分块处理大表
    DELETE FROM logs WHERE created_at < '2020-01-01' LIMIT 1000;
6. ​利用分区表
  • 按时间分区
    -- 按月份分区(具体语法因数据库而异)
    CREATE TABLE logs (id INT,log_time DATETIME,message TEXT
    ) PARTITION BY RANGE (YEAR(log_time), MONTH(log_time));
  • 优势:快速定位分区,减少扫描范围。

三、高级优化场景

1. ​JOIN 优化
  • 小表驱动大表
    -- 假设 users 是小表,orders 是大表
    SELECT * FROM users u
    JOIN orders o ON u.id = o.user_id;
  • 使用 STRAIGHT_JOIN(MySQL)​:强制指定 JOIN 顺序。
2. ​临时表与物化视图
  • 临时表
    CREATE TEMPORARY TABLE temp_high_salary AS
    SELECT * FROM employees WHERE salary > 10000;
  • 物化视图:预计算复杂查询结果(如 PostgreSQL 的 MATERIALIZED VIEW)。
3. ​统计信息更新
  • 手动更新​(适用于数据变化大的表):
    ANALYZE TABLE users; -- MySQL
    VACUUM ANALYZE users; -- PostgreSQL
4. ​避免锁竞争
  • 使用乐观锁
    UPDATE products SET stock = stock - 1
    WHERE id = 100 AND stock > 0;
  • 分拆事务:将大事务拆分为小操作。

四、工具与调试

  1. 数据库管理工具
    • MySQL: EXPLAIN FORMAT=JSONSHOW PROFILE
    • PostgreSQL: EXPLAIN ANALYZEpg_stat_statements
  2. 监控工具
    • Prometheus + Grafana(监控慢查询、锁等待)。
  3. 基准测试
    • 使用 sysbench 或自定义脚本模拟负载。

五、常见误区

  1. 过度索引:索引会降低写入速度,需权衡。
  2. 忽略 NULL 值WHERE column = NULL 应改为 WHERE column IS NULL
  3. 滥用子查询:优先使用 JOIN 或 CTE。
  4. 不更新统计信息:导致优化器选择错误执行计划。

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

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

相关文章

手机零售行业的 AI 破局与创新降本实践 | OceanBase DB大咖说

OceanBase《DB 大咖说》第 20 期&#xff0c;我们邀请了九机与九讯云的技术总负责人&#xff0c;李远军&#xff0c;为我们分享手机零售企业如何借力分布式数据库OceanBase&#xff0c;赋能 AI 场景&#xff0c;并通过简化架构实现成本管控上的突破与创新。 李远军于2016年加入…

高并发金融系统,“可观测-可追溯-可回滚“的闭环审计体系

一句话总结 在高并发金融系统中&#xff0c;审计方案设计需平衡"观测粒度"与"系统损耗"&#xff0c;通过双AOP实现非侵入式采集&#xff0c;三表机制保障操作原子性&#xff0c;最终形成"可观测-可追溯-可回滚"的闭环体系。 业务痛点与需求 在…

迅为iTOP-RK3576人工智能开发板Android 系统接口功能测试

2.1 开机启动 开发板接通电源&#xff0c;并按下电源开关&#xff0c;系统即启动&#xff0c;在启动过程中&#xff0c;系统会显示下图中的开机画面&#xff0c;它们分别是 Android 系统启动时的 Logo 画面&#xff1a; 最后会显示如下解锁画面&#xff1a; 2.2 命令终端 将…

Linux云计算SRE-第二十一周

构建单节点prometheus&#xff0c;部署node exporter和mongo exporter。构建kibana大盘。包含主机PU使用率&#xff0c;主机MEM使用率&#xff0c;主机网络包速度。mongo db大盘&#xff0c;包含节点在线状态&#xff0c;读操作延迟等 一、实验环境准备 - 节点信息&#xff1…

蓝桥杯 - 简单 - 产品360度展示

介绍 在电子商务网站中&#xff0c;用户可以通过鼠标或手势交互实现 360 度全方位查看产品&#xff0c;提升用户体验。现在需要你设计一个 Pipeline 管道函数&#xff0c;用于控制 360 度展示产品的动画序列&#xff0c;通过管道连接各个动画步骤&#xff0c;使产品以流畅的方…

【Rust基础】使用LanceDB构建高性能以图搜图服务

简介 最近使用LanceDB构建了一个以图搜图服务&#xff0c;用于相似图片检索&#xff0c;支持以下功能&#xff1a; 搜索 支持向量搜索&#xff0c;查找相似图片支持通过item_id搜索精确搜索 数据管理 支持添加数据、批量导入CSV或JSON数据支持已有数据修改、删除 API 提供HTT…

蓝桥杯备考:模拟算法之排队接水

简单的模拟就行了&#xff0c;把他们的时间排序&#xff0c;时间最少的先上&#xff0c;然后算出每个人的等待时间的平均值 #include <iostream> #include <algorithm> using namespace std; const int N 1e310; int n; double sum; double ret; struct node{int…

zynq7000 + ucos3 + lwip202_v1_2调试过程

1 现在裸机应用上验证lwip 跑起来可能会报错&#xff0c;看下面的链接解决 zynq 网卡Phy setup error问题 zynq 网卡Phy setup error问题-CSDN博客 2 ping同以后&#xff0c;在zynq上添加ucos系统 链接如下&#xff1a; ZYNQ移植uCOSIII_zynq ucos-CSDN博客 3 移植lwip协议…

如何用 Postman 正确传递 Date 类型参数,避免服务器解析错误?

如何在 Postman 中传递 Date 类型参数。调试工具如何模拟发送用户端的当前时间呢&#xff1f; Postman 传递 Date 类型参数教程

卷积神经网络在图像分割中的应用:原理、方法与进展介绍

摘要 图像分割是计算机视觉领域的核心任务之一&#xff0c;旨在将图像划分为具有语义意义的区域。卷积神经网络&#xff08;CNN&#xff09;因其强大的特征提取能力&#xff0c;已成为图像分割的主流方法。本文系统介绍了CNN在图像分割中的关键技术&#xff0c;包括全卷积网络…

VMware Windows Tools 存在认证绕过漏洞(CVE-2025-22230)

漏洞概述 博通公司&#xff08;Broadcom&#xff09;近日修复了 VMware Windows Tools 中存在的一个高危认证绕过漏洞&#xff0c;该漏洞编号为 CVE-2025-22230&#xff08;CVSS 评分为 9.8&#xff09;。VMware Windows Tools 是一套实用程序套件&#xff0c;可提升运行在 VM…

DeepSeek-V3-0324对比OpenAI GPT-4o和Gemini 2.5 Pro

以下是DeepSeek-V3-0324、OpenAI GPT-4o与谷歌Gemini 2.5 Pro模型的更新点及优化对比总结&#xff1a; 1. DeepSeek-V3-0324 开源地址&#xff1a;https://huggingface.co/deepseek-ai/DeepSeek-V3-0324 核心更新与优化 性能提升&#xff1a; 采用6850亿参数MoE架构&#xff…

视频编码器的抉择:x264、x265、libaom、vvenc 对比测试实验

264、x265、libaom、vvenc 对比测试实验 测试机器配置&#xff1a;Apple M1 Pro -16G编码器版本&#xff08;选择自己编译&#xff09;&#xff1a;所有源码都是当前最新更新的状态&#xff0c;此外各类编码具体的编译过程可参考我的相关系列博客。 编码器GitHubx264git clon…

【极速版 -- 大模型入门到进阶】LORA:大模型轻量级微调

文章目录 &#x1f30a; 有没有低成本的方法微调大模型&#xff1f;&#x1f30a; LoRA 的核心思想&#x1f30a; LoRA 的初始化和 r r r 的值设定&#x1f30a; LoRA 实战&#xff1a;LoraConfig参数详解 论文指路&#xff1a;LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE M…

初识MySQl · 内置函数

目录 前言&#xff1a; 日期类函数 字符串函数 数学类函数 其他函数 前言&#xff1a; 在前文的学习我们已经简单了解了部分函数&#xff0c;比如count()函数什么的&#xff0c;今天我们主要是笼统的学习一下MySQL中的函数&#xff0c;仅仅从使用的角度来学习&#xff0c…

Python每日一题(7)

Python每日一题 2025.3.27 一、题目二、分析三、自己源代码四、deepseek答案五、源代码与ai分析 一、题目 question["""编写程序,生成包含20个随机数的列表,然后将前十个元素升序排列,后10个元素降序排列,并输出结果""" ]二、分析 今天本来写了…

一些需要学习的C++库:CGAL和Eysshot

写在前面&#xff1a; 从开始工作到现在&#xff0c;去过多家公司&#xff0c;多个行业&#xff0c; 虽然大部分时间在通信业&#xff0c;但也有其它的行业的工作没有做完&#xff0c;但也很感兴趣。每次想要研究一下时&#xff0c;总是想不起来。 这里写一些信息&#xff0c;…

嵌入式linux系统中对应的文件锁详细实现方法

//文件锁:flock用于对文件加锁或者解锁但是只能产生建议性锁,并且同一个文件不会同时 具有共享锁和互斥锁。 第一:flock函数对应的要素 头文件: #include <sys/file.h> 函数原型:int flock(int fd,int operation) 参数: fd:表示需要加锁文件的文件描述符 operati…

WEB或移动端常用交互元素及组件 | Axure / 元件类型介绍(表单元件、菜单和表格 、流程元件、标记元件)

文章目录 引言I Axure / 元件类型介绍基本元件表单元件菜单和表格流程元件标记元件II Axure 基础Axure / 常用功能介绍Axure / 常用元素实例Axure / 动态交互实例Axure / 常用设计分辨率推荐III Axure / 创建自己的元件库元件库作用元件库的创建及使用引言 I Axure / 元件类型介…

如何排查C++程序的CPU占用过高的问题

文章目录 可能的原因程序设计的BUG系统资源问题恶意软件硬件问题 通常步骤一个简单的问题代码在windows平台上如何排查Windows Process ExplorerWinDBG 在Linux平台如何排查使用TOP GDBPerf 可能的原因 程序设计的BUG 有死循环低效算法与数据结构滥用自旋锁频繁的系统调用&a…