MySQL高级语句深度解析与应用实践

news2025/4/2 15:11:48

一、窗口函数:数据分析的利器

1. 窗口函数基础概念

窗口函数(Window Function)是MySQL 8.0引入的强大特性,它可以在不减少行数的情况下对数据进行聚合计算和分析

SELECT 
    employee_name,
    department,
    salary,
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank
FROM employees;

核心组件:
PARTITION BY:定义窗口分区(类似GROUP BY但不聚合)
ORDER BY:确定窗口内行的排序
frame_clause:定义窗口框架(ROWS/RANGE BETWEEN)

2. 常用窗口函数分类

排名函数

ROW_NUMBER():连续编号(1,2,3…)
RANK():并列排名会跳过后续序号(1,2,2,4…)
DENSE_RANK():并列排名不跳号(1,2,2,3…)

聚合函数

SUM()/AVG()/COUNT()/MIN()/MAX() OVER()

分布函数

PERCENT_RANK():相对排名百分比
CUME_DIST():累积分布值

前后函数

LAG(column, n):访问前n行数据
LEAD(column, n):访问后n行数据
FIRST_VALUE()/LAST_VALUE():窗口首尾值

3.高级窗口框架控制

SELECT 
    date,
    revenue,
    AVG(revenue) OVER (
        ORDER BY date 
        ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
    ) as moving_avg
FROM sales;

框架类型:
ROWS:物理行偏移
RANGE:逻辑值范围
GROUPS:MySQL 8.0.2+支持,按组偏移

二、Common Table Expressions (CTE):提升查询可读性

基础CTE语法

WITH department_stats AS (
    SELECT 
        department,
        AVG(salary) as avg_salary,
        COUNT(*) as emp_count
    FROM employees
    GROUP BY department
)
SELECT * FROM department_stats WHERE avg_salary > 5000;

递归CTE实现层次查询

WITH RECURSIVE org_hierarchy AS (
    -- 基础查询(锚成员)
    SELECT id, name, manager_id, 1 as level
    FROM employees
    WHERE manager_id IS NULL
    
    UNION ALL
    
    -- 递归查询(递归成员)
    SELECT e.id, e.name, e.manager_id, h.level + 1
    FROM employees e
    JOIN org_hierarchy h ON e.manager_id = h.id
)
SELECT * FROM org_hierarchy;

应用场景:
组织结构图
产品分类树
社交网络关系

CTE优化技巧

MATERIALIZED:强制物化CTE结果
MERGE:将CTE合并到主查询
限制递归深度:SET @@cte_max_recursion_depth = 100;

三、高级JSON处理:应对半结构化数据

JSON创建与修改

-- 创建JSON
SELECT JSON_OBJECT('name', name, 'salary', salary) as emp_json
FROM employees;

-- 修改JSON
UPDATE products 
SET attributes = JSON_SET(attributes, '$.color', 'blue')
WHERE id = 1001;

JSON路径查询

SELECT 
    product_id,
    JSON_EXTRACT(attributes, '$.dimensions.width') as width,
    attributes->>'$.manufacturer' as manufacturer
FROM products
WHERE JSON_CONTAINS(attributes, '"wireless"', '$.features');

JSON聚合函数

SELECT 
    department,
    JSON_ARRAYAGG(JSON_OBJECT('id', id, 'name', name)) as employees
FROM staff
GROUP BY department;

四、索引优化高级技巧

函数索引(MySQL 8.0+)

-- 创建基于表达式的索引
CREATE INDEX idx_name_lower ON employees ((LOWER(name)));

-- 使用时必须完全匹配索引表达式
SELECT * FROM employees WHERE LOWER(name) = 'john';

不可见索引

-- 创建不可见索引(优化器忽略)
CREATE INDEX idx_temp ON orders (customer_id) INVISIBLE;

-- 测试后决定是否可见
ALTER TABLE orders ALTER INDEX idx_temp VISIBLE;

降序索引优化

-- 创建降序索引
CREATE INDEX idx_created_desc ON log_entries (created_at DESC);

-- 适合ORDER BY ... DESC查询
SELECT * FROM log_entries ORDER BY created_at DESC LIMIT 100;

五、高级事务处理

保存点(Savepoint)控制

START TRANSACTION;
INSERT INTO orders (...) VALUES (...);
SAVEPOINT order_created;
UPDATE inventory SET quantity = quantity - 1;
-- 发生错误时
ROLLBACK TO SAVEPOINT order_created;
COMMIT;

多版本并发控制(MVCC)深度优化

-- 使用特定隔离级别
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- 优化长时间事务
SET TRANSACTION READ ONLY;

锁优化策略

-- 行锁升级为表锁(慎用)
LOCK TABLES orders WRITE;

-- 使用SKIP LOCKED处理高并发
SELECT * FROM jobs 
WHERE status = 'pending'
ORDER BY priority DESC
LIMIT 1 FOR UPDATE SKIP LOCKED;

六、性能分析高级技术

执行计划深度解读

EXPLAIN FORMAT=JSON 
SELECT * FROM orders WHERE customer_id IN (
    SELECT id FROM customers WHERE region = 'APAC'
);

-- 关键指标分析
/* 
"cost_info": {
    "query_cost": "10.25"  -- 总预估成本
},
"table_scan": {
    "rows_examined_per_scan": 1000,
    "rows_produced_per_join": 100,
    "filtered": "10.00"
}
*/

优化器提示(Optimizer Hints)

SELECT /*+ INDEX(orders idx_customer) */ *
FROM orders FORCE INDEX (idx_customer)
WHERE customer_id = 1001;

性能模式(Performance Schema)监控

-- 分析最耗资源的SQL
SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;

-- 查看锁等待
SELECT * FROM performance_schema.events_waits_current
WHERE EVENT_NAME LIKE '%lock%';

七、实战案例:电商数据分析系统

用户购买路径分析

WITH user_journey AS (
    SELECT 
        user_id,
        event_time,
        event_type,
        LAG(event_type, 1) OVER (PARTITION BY user_id ORDER BY event_time) as prev_event,
        LEAD(event_type, 1) OVER (PARTITION BY user_id ORDER BY event_time) as next_event
    FROM user_events
    WHERE event_date = CURDATE()
)
SELECT 
    prev_event,
    event_type,
    next_event,
    COUNT(*) as transition_count
FROM user_journey
GROUP BY prev_event, event_type, next_event
ORDER BY transition_count DESC;

实时库存预警

WITH inventory_status AS (
    SELECT 
        product_id,
        current_stock,
        AVG(current_stock) OVER (PARTITION BY category_id) as category_avg,
        RANK() OVER (PARTITION BY warehouse_id ORDER BY current_stock) as stock_rank
    FROM inventory
)
SELECT product_id, current_stock
FROM inventory_status
WHERE 
    current_stock < (0.2 * category_avg) OR
    stock_rank <= 5; -- 每个仓库库存最低的5个商品

建议

渐进式优化:先确保SQL正确性,再逐步应用高级优化
测试验证:所有优化必须通过真实数据验证
监控迭代:持续监控执行计划变化
适度使用:避免过度复杂化SQL逻辑
版本特性:充分利用MySQL 8.0+的新特性

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE5新材质系统效果Demo展示

1、玉质材质&#xff0c;透明玻璃材质&#xff0c;不同透射和散射。 2、浅水地面&#xff0c;地面层&#xff0c;水层&#xff0c;地面湿度&#xff0c;水面高度&#xff0c;水下扰动&#xff0c;水下浇洒&#xff0c;水下折射 Substrate-Water Substrate-Water-CodeV2

wps 怎么显示隐藏文字

wps 怎么显示隐藏文字 》文件》选项》视图》勾选“隐藏文字” wps怎么设置隐藏文字 wps怎么设置隐藏文字

CXL UIO Direct P2P学习

前言&#xff1a; 在CXL协议中&#xff0c;UIO&#xff08;Unordered Input/Output&#xff09; 是一种支持设备间直接通信&#xff08;Peer-to-Peer, P2P&#xff09;的机制&#xff0c;旨在绕过主机CPU或内存的干预&#xff0c;降低延迟并提升效率。以下是UIO的核心概念及UI…

leetcode138.随即链表的复制

思路源于 【力扣hot100】【LeetCode 138】随机链表的复制&#xff5c;哈希表 采用一个哈希表&#xff0c;键值对为<原链表的结点&#xff0c;新链表的结点>&#xff0c;第一次遍历原链表结点时只创建新链表的结点&#xff0c;第二次遍历原链表结点时&#xff0c;通过键拿…

《网络管理》实践环节01:OpenEuler22.03sp4安装zabbix6.2

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 1 环境 openEuler 22.03 LTSsp4PHP 8.0Apache 2Mysql 8.0zabbix6.2.4 表1-1 Zabbix网络规划&#xff08;用你们自己的特征网段规划&#xff09; 主机名 IP 功能 备注 zbx6svr 19…

Opencv计算机视觉编程攻略-第四节 图直方图统计像素

Opencv计算机视觉编程攻略-第四节 图直方图统计像素 1.计算图像直方图2.基于查找表修改图像3.直方图均衡化4.直方图反向投影进行内容查找5.用均值平移法查找目标6.比较直方图搜索相似图像7.用积分图统计图像 1.计算图像直方图 图像统计直方图的概念 图像统计直方图是一种用于描…

深度学习处理时间序列(5)

Keras中的循环层 上面的NumPy简单实现对应一个实际的Keras层—SimpleRNN层。不过&#xff0c;二者有一点小区别&#xff1a;SimpleRNN层能够像其他Keras层一样处理序列批量&#xff0c;而不是像NumPy示例中的那样只能处理单个序列。也就是说&#xff0c;它接收形状为(batch_si…

Mysql 索引性能分析

1.查看CRUD次数 show global status like Com_______&#xff08;7个下划线&#xff09; show global status like Com_______ 2.慢SQL分析 SET GLOBAL slow_query_log ON;-- 设置慢SQL日志记录开启 SET GLOBAL long_query_time 2; -- 设置执行超过 2 秒的查询为慢查询 开…

win11+ubuntu双系统安装

操作步骤&#xff1a; 官网下载ubuntu 最新镜像文件 准备U盘 准备一个容量不小于 8GB 的 U 盘&#xff0c;用于制作系统安装盘。制作过程会格式化 U 盘&#xff0c;请注意提前备份数据。 制作U盘启动盘 使用rufus工具&#xff0c;或者 balenaEtcher工具&#xff08;官网安…

linux-5.10.110内核源码分析 - 写磁盘(从VFS系统调用到I/O调度及AHCI写磁盘)

1、VFS写文件到page缓存(vfs_write) 1.1、写裸盘(dd) 使用如下命令写裸盘&#xff1a; dd if/dev/zero of/dev/sda bs4096 count1 seek1 1.2、系统调用(vfs_write) 系统调用栈如下&#xff1a; 对于调用栈的new_sync_write函数&#xff0c;buf为写磁盘的内容的内存地址&…

arinc818 fpga单色图像传输ip

arinc818协议支持的常用线速率如下图 随着图像分辨率的提高&#xff0c;单lane的速率无法满足特定需求&#xff0c;一种方式是通过多个LANE交叉的去传输图像&#xff0c;另外一种是通过降低图像的带宽&#xff0c;即通过只传单色图像达到对应的效果 程序架构如下图所示&#x…

业务流程先导及流程图回顾

一、测试流程回顾 &#xfeff; 1. 备测内容回顾 &#xfeff; 备测内容: 本次测试涵盖买家和卖家的多个业务流程&#xff0c;包括下单流程、发货流程、搜索退货退款、支付抢购、换货流程、个人中心优惠券等。 2. 先测业务强调 &#xfeff; 1&#xff09;测试业务流程 …

HCIP(RSTP+MSTP)

一、STP的重新收敛&#xff1a; 复习STP接口状态 STP初次收敛至少需要50秒的时间。STP的重新收敛情况&#xff1a; 检测到拓扑变化&#xff1a;当网络中的链路故障或新链路加入时&#xff0c;交换机会检测到拓扑变化。 选举新的根桥&#xff1a;如果原来的根桥故障或与根桥直…

《无线江湖五绝:BLE/WiFi/ZigBee的频谱大战》

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 文章目录 **第一回武林大会&#xff0c;群雄并起****第二回WiFi的“降龙十八掌”****第三回BLE的“峨眉轻功”****第四回ZigBee的“暗器百解”****第五回LoRa的“千里传音”****第六回NB…

QT第六课------QT界面优化------QSS

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

C++ STL常用算法之常用算术生成算法

常用算术生成算法 学习目标: 掌握常用的算术生成算法 注意: 算术生成算法属于小型算法&#xff0c;使用时包含的头文件为 #include <numeric> 算法简介: accumulate // 计算容器元素累计总和 fill // 向容器中添加元素 accumulate 功能描述: 计算区间内容器元素…

Tof 深度相机原理

深度相机(TOF)的工作原理_tof相机原理-CSDN博客 深度剖析 ToF 技术&#xff1a;原理、优劣、数据纠错与工业应用全解析_tof技术-CSDN博客 飞行时间技术TOF_tof计算公式-CSDN博客 深度相机&#xff08;二&#xff09;——飞行时间&#xff08;TOF&#xff09;_飞行时间技术-C…

【Linux篇】进程入门指南:操作系统中的第一步

步入进程世界&#xff1a;初学者必懂的操作系统概念 一. 冯诺依曼体系结构1.1 背景与历史1.2 组成部分1.3 意义 二. 进程2.1 进程概念2.1.1 PCB&#xff08;进程控制块&#xff09; 2.2 查看进程2.2.1 使用系统文件查看2.2.2 使⽤top和ps这些⽤⼾级⼯具来获取2.2.3 通过系统调用…

SpringBean模块(一)定义如何创建生命周期

一、介绍 1、简介 在 Spring 框架中&#xff0c;Bean 是指由 Spring 容器 管理的 Java 对象。Spring 负责创建、配置和管理这些对象&#xff0c;并在应用程序运行时对它们进行依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;。 通俗地讲&#xff0c;Sp…

Redis-04.Redis常用命令-字符串常用命令

一.字符串操作命令 set name jack 点击左侧name&#xff0c;显示出值。 get name get abc&#xff1a;null setex key seconds value&#xff1a;设置过期时间&#xff0c;过期后该键值对将会被删除。 然后再get&#xff0c;在过期时间内可以get到&#xff0c;过期get不到。…