当前位置: 首页 > news >正文

MySQL的Order by与Group by优化详解!

在这里插入图片描述

目录

    • 前言
    • 核心思想:让索引帮你“排好序”或“分好组”
    • Part 1: ORDER BY 优化详解
      • 1.1 什么是 Filesort?为什么它慢?
      • 1.2 如何避免 Filesort?—— 利用索引的有序性
      • 1.3 EXPLAIN 示例 (ORDER BY)
    • Part 2: GROUP BY 优化详解
      • 2.1 什么是 Using Temporary 和 Using Filesort (for GROUP BY)?
      • 2.2 如何避免 Using Temporary 和 Filesort (for GROUP BY)?—— 利用索引的有序性
      • 2.3 EXPLAIN 示例 (GROUP BY)
    • Part 3: 联合索引,同时优化 WHERE, ORDER BY, GROUP BY
    • 总结 📝

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!

其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等

如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning

前言

你好呀,数据库优化路上的同行们!🚀 当我们在数据库中查询数据时,除了根据 WHERE 条件筛选记录,经常还需要对结果进行排序 (ORDER BY) 或分组聚合 (GROUP BY)。这两个操作看似简单,但一旦数据量上来,它们就可能成为查询的性能瓶颈,导致查询变慢,甚至拖垮整个数据库系统。

为什么 ORDER BYGROUP BY 会慢呢?因为它们通常需要对大量数据进行排序或构建哈希表进行聚合,这个过程可能需要在内存甚至磁盘上进行,消耗大量的 CPU 和 I/O 资源。在 EXPLAIN 的输出中,如果看到 Extra 列出现了 Using filesortUsing temporary,那就要警惕了,这往往是性能问题的信号!🚨

今天,我们就来详细探讨如何通过合理的索引策略,帮助 MySQL 避免这些昂贵的操作,让 ORDER BYGROUP BY 飞起来!✨

核心思想:让索引帮你“排好序”或“分好组”

优化 ORDER BYGROUP BY 的核心思路是一样的:利用索引的有序性。B+tree 索引(MySQL InnoDB 存储引擎的默认索引类型)的一个关键特性就是存储的数据是按照索引列的值有序排列的。如果查询所需的排序或分组顺序恰好与某个索引的顺序一致,MySQL 就可以直接按照索引的顺序读取数据,而无需额外的排序或分组步骤。

Part 1: ORDER BY 优化详解

ORDER BY 子句用于指定结果集的排序方式。如果不能使用索引进行排序,MySQL 就需要执行一个额外的排序步骤,这个过程称为 Filesort

1.1 什么是 Filesort?为什么它慢?

当 MySQL 无法利用索引来满足 ORDER BY 的需求时,它会将查询结果(或者至少是需要排序的列以及用于回表的主键/行指针)读取出来,然后在内存中进行排序。如果内存不足,就会将数据分块,利用磁盘进行“归并排序”。这个过程就是 Filesort。

EXPLAINExtra 列显示 Using filesort,就表示发生了 Filesort。

为什么 Filesort 慢?

  • CPU 消耗: 排序本身是一个计算密集型操作。
  • 内存消耗: 需要分配内存缓冲区来存储待排序的数据。
  • 磁盘 I/O (如果内存不足): 当数据量大到内存装不下时,就会使用临时文件进行排序,产生大量的磁盘读写,这是最慢的情况。

1.2 如何避免 Filesort?—— 利用索引的有序性

避免 Filesort 的最佳方法是创建一个索引,使其列的顺序和排序方向与 ORDER BY 子句的要求一致。

条件:

要让索引能够用于 ORDER BY,通常需要满足以下条件:

  1. 索引列顺序: ORDER BY 子句中的所有列必须是索引中的连续的列,并且是索引的前缀
    • 例如,索引 (colA, colB, colC) 可以用于 ORDER BY colA, ORDER BY colA, colB, ORDER BY colA, colB, colC
    • 但不能用于 ORDER BY colB, ORDER BY colA, colC, ORDER BY colB, colA
  2. 排序方向: ORDER BY 子句中所有列的排序方向(ASC 或 DESC)必须一致,并且与索引的创建方向一致,或者全部与索引创建方向相反。MySQL 可以倒序扫描索引来满足相反方向的排序。
    • 例如,索引 (colA ASC, colB ASC) 可以用于 ORDER BY colA ASC, colB ASCORDER BY colA DESC, colB DESC
    • 但不能用于 ORDER BY colA ASC, colB DESC
  3. WHERE 子句与索引的关系: 如果查询有 WHERE 子句,并且 WHERE 子句使用了索引的前缀列进行等值查询,那么 ORDER BY 子句可以使用索引中紧随其后的列进行排序。
    • 例如,索引 (colA, colB, colC)
    • 查询 SELECT * FROM table WHERE colA = '...' ORDER BY colB, colC; 可以使用索引进行排序。
    • 查询 SELECT * FROM table WHERE colA > '...' ORDER BY colB, colC; 可能无法使用索引排序,因为 WHERE 子句在 colA 上是范围查询,中断了索引的连续性。
    • 查询 SELECT * FROM table WHERE colB = '...' ORDER BY colA; 无法使用索引排序,因为 WHERE 子句没有使用索引的前缀。
  4. 排序的列和 WHERE 子句的过滤列不能是相互冲突的范围: 例如 WHERE colA = 1 ORDER BY colA.
  5. 没有 LIMITORDER BY 列不在 WHERE 子句中,或 WHERE 是范围查询: 这种情况下,MySQL 可能为了避免全索引扫描而选择 Filesort。但如果有了 LIMIT,MySQL 可能会重新考虑使用索引排序。
  6. ORDER BY RAND() 这个是随机排序,索引是无法满足的,必定是 Filesort。避免在生产环境使用 ORDER BY RAND(),可以考虑其他随机获取数据的方法。

1.3 EXPLAIN 示例 (ORDER BY)

假设我们有表 products

CREATE TABLE products (product_id INT PRIMARY KEY,category_id INT,price DECIMAL(10, 2),create_time DATETIME
);-- 创建一个联合索引
CREATE INDEX idx_cat_price_time ON products (category_id, price, create_time);-- 可以自己插入一些数据来进行下面的测试!

示例 1: Filesort (排序列不在索引前缀)

EXPLAIN SELECT * FROM products ORDER BY create_time DESC;

EXPLAIN 结果可能显示 type: ALL (全表扫描) 和 Extra: Using filesort。因为 create_time 不是索引 idx_cat_price_time 的前缀。

示例 2: 利用索引排序 (符合前缀规则)

EXPLAIN SELECT * FROM products ORDER BY category_id ASC, price ASC;

EXPLAIN 结果可能显示 type: index (全索引扫描) 或 type: ALL (如果优化器认为全表扫描更快),但 Extra没有 Using filesort。或者如果同时有 WHERE 子句限制了扫描范围,type 可能是 rangeref,且 Extra 中没有 Using filesort

EXPLAIN SELECT * FROM products WHERE category_id = 10 ORDER BY price ASC, create_time ASC;

EXPLAIN 结果可能显示 type: ref,并且 Extra没有 Using filesort。因为 WHERE 子句使用了索引前缀 category_id 的等值条件,ORDER BY 子句使用了索引中紧随其后的列 pricecreate_time

示例 3: Filesort (排序方向不一致)

EXPLAIN SELECT * FROM products WHERE category_id = 10 ORDER BY price ASC, create_time DESC;

EXPLAIN 结果很可能显示 type: ref,但 Extra 中有 Using filesort。因为 price 是 ASC 排序,而 create_time 是 DESC 排序,与索引定义 (..., price ASC, create_time ASC) 的方向不完全一致(或者完全相反)。

优化建议 (ORDER BY):

  • 分析慢查询中的 ORDER BY 子句。
  • 检查是否有合适的索引,其列的顺序和方向能匹配 ORDER BY 的需求。
  • 如果 WHEREORDER BY 都很频繁,考虑创建联合索引,将 WHERE 条件中用于等值过滤的列放在前面,将 ORDER BY 中的列按顺序放在后面。
  • 使用 EXPLAIN 验证 Filesort 是否被消除。

Part 2: GROUP BY 优化详解

GROUP BY 子句用于将结果集按照一个或多个列进行分组,通常与聚合函数(如 COUNT(), SUM(), AVG(), MAX(), MIN())一起使用。如果不能利用索引完成分组,MySQL 可能会创建临时表来存储中间结果,或者先排序再分组。

2.1 什么是 Using Temporary 和 Using Filesort (for GROUP BY)?

当 MySQL 无法直接通过索引的有序性来满足 GROUP BY 的需求时,它可能采取以下策略:

  1. 创建临时表 (Using temporary): MySQL 会创建一个内存或磁盘上的临时表,将需要分组的列和聚合所需的列存入其中。然后遍历所有符合 WHERE 条件的行,将数据插入临时表,并在插入时进行聚合(如果临时表上有主键或唯一索引)或插入后进行聚合。
  2. 排序后分组 (Using filesort): MySQL 会将结果集按照 GROUP BY 的列进行排序,然后遍历排序后的结果进行分组聚合。这个排序过程也可能导致 Filesort。

EXPLAINExtra 列显示 Using temporaryUsing filesort(有时两者都会出现),就表示 GROUP BY 过程不够优化。

为什么慢?

  • 临时表: 创建和维护临时表有开销,尤其是当临时表溢写到磁盘时,会产生大量磁盘 I/O。
  • Filesort:ORDER BY 中的 Filesort,消耗 CPU 和 I/O。

2.2 如何避免 Using Temporary 和 Filesort (for GROUP BY)?—— 利用索引的有序性

类似于 ORDER BY,利用索引的有序性可以帮助 MySQL 直接按分组所需的顺序扫描数据,从而避免临时表和额外的排序。

条件:

要让索引能够用于 GROUP BY,通常需要满足以下条件:

  1. 索引列顺序: GROUP BY 子句中的所有列必须是索引中的连续的列,并且是索引的前缀
    • 例如,索引 (colA, colB, colC) 可以用于 GROUP BY colA, GROUP BY colA, colB, GROUP BY colA, colB, colC
    • 但不能用于 GROUP BY colB, GROUP BY colA, colC, GROUP BY colB, colA
  2. WHERE 子句与索引的关系: 如果查询有 WHERE 子句,并且 WHERE 子句使用了索引的前缀列进行等值查询,那么 GROUP BY 子句可以使用索引中紧随其后的列进行分组。
    • 例如,索引 (colA, colB, colC)
    • 查询 SELECT colA, colB, COUNT(*) FROM table WHERE colA = '...' GROUP BY colA, colB; 可以使用索引进行分组。
    • 查询 SELECT colA, colB, COUNT(*) FROM table WHERE colA > '...' GROUP BY colA, colB; 可能无法使用索引分组,原因同 ORDER BY
    • 查询 SELECT colA, colB, COUNT(*) FROM table WHERE colB = '...' GROUP BY colA, colB; 无法使用索引分组,因为 WHERE 子句没有使用索引的前缀。
  3. GROUP BY 列的顺序很重要: 必须严格按照索引列的顺序进行分组。
  4. 没有 DISTINCTMIN/MAX 在非索引列上: 某些复杂的聚合函数组合可能阻止索引用于分组。COUNT(DISTINCT ...) 也经常导致无法使用索引进行分组。

2.3 EXPLAIN 示例 (GROUP BY)

还是使用上面的 products 表和 idx_cat_price_time (category_id, price, create_time) 索引。

示例 4: Using Temporary / Filesort (分组列不在索引前缀)

EXPLAIN SELECT price, COUNT(*) FROM products GROUP BY price;

EXPLAIN 结果可能显示 type: ALLExtra: Using temporary; Using filesort。因为 price 不是索引 idx_cat_price_time 的前缀。

示例 5: 利用索引分组 (符合前缀规则)

EXPLAIN SELECT category_id, COUNT(*) FROM products GROUP BY category_id;

EXPLAIN 结果可能显示 type: index (全索引扫描) 或 type: ALL,但 Extra没有 Using temporaryUsing filesort。或者如果同时有 WHERE 子句限制了扫描范围,type 可能是 rangeref,且 Extra 中没有 Using temporaryUsing filesort

EXPLAIN SELECT category_id, price, COUNT(*) FROM products WHERE category_id = 10 GROUP BY category_id, price;

EXPLAIN 结果可能显示 type: ref,并且 Extra没有 Using temporaryUsing filesort。因为 WHERE 子句使用了索引前缀 category_id 的等值条件,GROUP BY 子句使用了索引中紧随其后的列 category_idprice(尽管 category_idWHERE 里已经限制了,但在 GROUP BY 里再次出现并不影响索引的使用)。

优化建议 (GROUP BY):

  • 分析慢查询中的 GROUP BY 子句。
  • 检查是否有合适的索引,其列的顺序能匹配 GROUP BY 的需求。
  • 如果 WHEREGROUP BY 都很频繁,考虑创建联合索引,将 WHERE 条件中用于等值过滤的列放在前面,将 GROUP BY 中的列按顺序放在后面。
  • 注意 GROUP BY 列的顺序必须和索引前缀严格匹配。
  • 对于 COUNT(DISTINCT ...) 或复杂聚合,可能难以用索引优化分组,需要考虑其他方案(如子查询、汇总表等)。
  • 使用 EXPLAIN 验证 Using temporaryUsing filesort 是否被消除。

Part 3: 联合索引,同时优化 WHERE, ORDER BY, GROUP BY

最理想的情况是,一个联合索引能够同时支持 WHERE 子句过滤、GROUP BY 分组和 ORDER BY 排序。这需要精心设计索引列的顺序。

索引列顺序的考虑优先级(通常):

  1. WHERE 子句中的等值条件列: 放在索引最前面,能最有效地缩小扫描范围。
  2. WHERE 子句中的范围条件列: 放在等值条件列后面。范围条件会终止索引后续列用于进一步的索引查找优化,但可能可以用于 ICP。
  3. GROUP BY 子句中的列: 放在 WHERE 条件列后面,且顺序要和 GROUP BY 的顺序一致。
  4. ORDER BY 子句中的列: 放在 GROUP BY 列后面(如果 GROUP BYORDER BY 使用的列不同),且顺序和方向要一致。
  5. 查询中需要返回的列 (用于索引覆盖): 如果可能,将查询中 SELECT 的其他列也加入到索引中,形成覆盖索引,彻底避免回表。这部分列通常放在索引的最后。

示例 6: 一个尝试同时优化 WHERE, GROUP BY, ORDER BY 的联合索引

假设我们有一个查询:

SELECT category_id, price, COUNT(*) as total_count
FROM products
WHERE category_id = 10 AND create_time >= '2023-01-01'
GROUP BY category_id, price
ORDER BY price ASC, category_id ASC; -- 注意这里的ORDER BY顺序

根据上述优先级和规则,我们可以尝试创建索引:

-- category_id 是等值条件,放最前
-- create_time 是范围条件,放 category_id 后面
-- GROUP BY 是 category_id, price,所以 price 放 create_time 后面
-- ORDER BY 是 price ASC, category_id ASC,这与 GROUP BY 的列顺序一致,可以考虑合并
CREATE INDEX idx_optimal ON products (category_id, create_time, price);

执行 EXPLAIN 看看效果:

EXPLAIN SELECT category_id, price, COUNT(*) as total_count
FROM products
WHERE category_id = 10 AND create_time >= '2023-01-01'
GROUP BY category_id, price
ORDER BY price ASC, category_id ASC;

理想情况下,如果优化器认为这个索引合适:

  • WHERE category_id = 10 利用索引前缀进行等值查找。
  • WHERE create_time >= '2023-01-01' 利用索引的 create_time 部分进行范围扫描(可能伴随 ICP)。
  • GROUP BY category_id, price 由于 category_idWHERE 中已固定,且 price 紧随 create_time 之后,MySQL 可以利用索引的有序性进行分组。
  • ORDER BY price ASC, category_id ASC 由于 GROUP BY 通常会隐含排序,且这里的 ORDER BY 列和方向与 GROUP BY 以及索引的后续列顺序一致,MySQL 可以直接使用索引的顺序,避免 Filesort。

EXPLAIN 结果中可能显示 type: range,并且 Extra 中没有 Using temporaryUsing filesort。✨

重要的注意事项:

  • ORDER BYGROUP BY 的列和方向必须严格匹配索引的顺序和方向(或完全相反)才能利用索引避免 Filesort/Using temporary。
  • 在一个查询中,ORDER BYGROUP BY 有时会“争抢”索引的使用。如果一个索引能同时满足两者,MySQL 优化器会选择最有利的方式。
  • GROUP BY 如果能使用索引,通常也意味着结果是按照 GROUP BY 的列排序的,所以如果 ORDER BY 的列和方向与 GROUP BY 完全一致,ORDER BY 就可以被“优化掉”或者说融入到分组过程中。
  • EXPLAIN 是唯一的真理!任何索引优化猜想都需要通过 EXPLAIN 来验证。

总结 📝

优化 ORDER BYGROUP BY 的核心在于让 MySQL 能够利用索引的有序性来完成排序和分组,从而避免代价高昂的 Filesort 和 Using temporary 操作。

  • ORDER BY 优化: 关注索引列的顺序和排序方向是否与 ORDER BY 子句匹配,特别是与 WHERE 子句结合时的“最左前缀”规则。目标是消除 EXPLAIN 中的 Using filesort
  • GROUP BY 优化: 关注索引列的顺序是否与 GROUP BY 子句匹配,同样要考虑与 WHERE 子句的结合。目标是消除 EXPLAIN 中的 Using temporaryUsing filesort
  • 联合索引: 精心设计的联合索引可以同时优化 WHEREGROUP BYORDER BY。索引列的顺序通常按照等值过滤、范围过滤、分组、排序的优先级来考虑。
  • EXPLAIN 神器: 永远使用 EXPLAIN 来分析查询的执行计划,确认 Filesort 和 Using temporary 是否被避免,并评估索引的使用情况。

数据库优化是一个持续学习和实践的过程。掌握了索引对 ORDER BYGROUP BY 的优化原理,并结合 EXPLAIN 工具进行分析,你就能更有效地提升数据库查询性能!

希望这篇详细的讲解对你有所启发!祝你的数据库查询越来越快!🚀

相关文章:

MySQL的Order by与Group by优化详解!

目录 前言核心思想:让索引帮你“排好序”或“分好组”Part 1: ORDER BY 优化详解1.1 什么是 Filesort?为什么它慢?1.2 如何避免 Filesort?—— 利用索引的有序性1.3 EXPLAIN 示例 (ORDER BY) Part 2: GROUP BY 优化详解2.1 什么是…...

使用小丸工具箱(视频压缩教学)压缩7倍

我们日常经常会遇见视频录制或者剪辑视频生成之后,视频文件非常占用存储空间,那么这款开源工具可以帮助我们压缩7倍,而且视频质量依然清晰。 软件下载 ①:可以通过我分享的CSDN资源下载:https://download.csdn.net/d…...

ui组件二次封装(vue)

组件二次封装的意义 保证一个系统中ui风格和功能的一致性便于维护 从属性、事件、插槽、ref这几方面考虑 属性和事件的处理:ui组件上绑定$attrs(v-model本质也是一个属性加一个事件,所以也在其列) 在自定义组件中打印$attrs&am…...

利用大型语言模型有效识别网络威胁情报报告中的攻击技术

摘要 本研究评估了网络威胁情报(CTI)提取方法在识别来自网络威胁报告中的攻击技术方面的性能,这些报告可从网络上获取,并使用了 MITRE ATT&CK 框架。我们分析了四种配置,这些配置利用了最先进的工具,包…...

笔试模拟 day4

观前提醒: 笔试所有系列文章均是记录本人的笔试题思路与代码,从中得到的启发和从别人题解的学习到的地方,所以关于题目的解答,只是以本人能读懂为目标,如果大家觉得看不懂,那是正常的。如果对本文的某些知…...

TCP的连接管理

三次握手 什么是三次握手? 1. 第一次握手(客户端 → 服务器) 客户端发送一个 SYN 报文,请求建立连接。 报文中包含一个初始序列号 SEQ x。 表示:我想和你建立连接,我的序列号是 x。 2. 第二次握手&a…...

ffmpeg 写入avpacket时候,即av_interleaved_write_frame方法是如何不需要 业务层释放avpacket的 逻辑分析

我们在通过 av_interleaved_write_frame方法 写入 avpacket的时候,通常不需要关心 avpacket的生命周期。 本文分析一下内部实现的部分。 ----> 代表一个内部实现。 A(){ B(); C(); } B(){ D(); } 表示为: A ---->B(); ---->D(); ---->C(); int…...

【MyBatis-7】深入理解MyBatis二级缓存:提升应用性能的利器

在现代应用开发中,数据库访问往往是性能瓶颈之一。作为Java生态中广泛使用的ORM框架,MyBatis提供了一级缓存和二级缓存机制来优化数据库访问性能。本文将深入探讨MyBatis二级缓存的工作原理、配置方式、使用场景以及最佳实践,帮助开发者充分利…...

扫雷革命:矩阵拓扑与安全扩散的数学之美

目录 扫雷革命:矩阵拓扑与安全扩散的数学之美引言第一章 雷区生成算法1.1 组合概率模型1.2 矩阵编码体系第二章 数字计算系统2.1 卷积核运算2.2 边缘处理第三章 安全扩散机制3.1 广度优先扩散3.2 记忆化加速第四章 玩家推理模型4.1 线性方程组构建4.2 概率决策模型第五章 高级…...

通俗的桥接模式

桥接模式(Bridge Pattern) 就像一座桥,把两个原本独立变化的东西连接起来,让它们可以各自自由变化,互不干扰。简单来说,就是 “把抽象和实现分开,用组合代替继承”。 一句话理解桥接模式 假设你…...

金丝猴食品:智能中枢AI-COP构建全链路数智化运营体系

“金丝猴奶糖”,这个曾藏在无数人童年口袋里的甜蜜符号,如今正经历一场数智焕新。当传统糖果遇上数字浪潮,这家承载着几代人味蕾记忆的企业,选择以数智化协同运营平台为“新配方”,将童年味道酿成智慧管理的醇香——让…...

基于定制开发开源AI智能名片S2B2C商城小程序的公私域流量融合运营策略研究

摘要:本文以定制开发开源AI智能名片S2B2C商城小程序为技术载体,系统探讨公域流量向私域流量沉淀的数字化路径。研究通过分析平台流量(公域流量)与私域流量的共生关系,提出"公域引流-私域沉淀-数据反哺"的闭环…...

一、数据仓库基石:核心理论、分层艺术与 ETL/ELT 之辨

随着企业数据的爆炸式增长,如何有效地存储、管理和分析这些数据,从中提炼价值,成为现代企业的核心竞争力之一。数据仓库 (Data Warehouse, DW) 正是为此而生的关键技术。理解其基础理论对于构建高效的数据驱动决策体系至关重要。 一、数据库…...

智慧能源大数据平台建设方案(PPT)

1、建设背景 2、建设思路 3、建设架构 4、应用场景 5、展望 软件开发全方位管理资料包清单概览: 任务部署指令书,可行性研究报告全集,项目启动审批文件,产品需求规格详尽说明书,需求调研策略规划,用户调研问…...

递归函数(斐波那契数列0,1,1,2,3,5,8,13,21,34,55...)

目录 一、斐波那契数列(兔子问题) 二、迭代法(用while循环推下一项 ) 三、递归函数 (函数的定义中调用函数自身的一种函数定义方式) 四、递归函数的底层逻辑推理 (二叉树推倒最左下节点回退法) 一、斐波那契数列(兔子问题&…...

Python 从 SQLite 数据库中批量提取图像数据

Python 从 SQLite 数据库中批量提取图像数据 flyfish 实现了一个可扩展的 SQLite 图像导出工具,能够自动检测图像格式、处理数据前缀,并将数据库中的二进制图像数据导出为文件系统中的标准图像文件 import os import sqlite3 from typing import Dict…...

rust-candle学习笔记12-实现因果注意力

参考:about-pytorch 定义结构体: struct CausalAttention {w_qkv: Linear,dropout: Dropout, d_model: Tensor,mask: Tensor,device: Device, } 定义new方法: impl CausalAttention {fn new(vb: VarBuilder, embedding_dim: usize, ou…...

vue3使用tailwindcss报错问题

npm create vitelatestnpm install -D tailwindcss postcss autoprefixernpx tailwindcss init 4. 不过执行 npx tailwindcss init 的时候控制台就报错了PS E:\vite-demo> npx tailwindcss init npm ERR! cb.apply is not a function npm ERR! A complete log of this run c…...

MySQL COUNT(*) 查询优化详解!

目录 前言1. COUNT(*) 为什么慢?—— InnoDB 的“计数烦恼” 🤔2. MySQL 执行 COUNT(*) 的方式 (InnoDB)3. COUNT(*) 优化策略:快!准!狠!策略一:利用索引优化带 WHERE 子句的 COUNT(*) (最常见且…...

5.Redission

5.1 前文锁问题 基于 setnx 实现的分布式锁存在下面的问题: 重入问题:重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如 HashTable 这样的代码中,他的方法都是使用 sync…...

RAG 赋能客服机器人:多轮对话与精准回复

一、引言 在人工智能技术飞速发展的今天,客服机器人已成为企业提升服务效率的重要工具。然而,传统客服系统在多轮对话连贯性和精准回复能力上存在明显短板。检索增强生成(Retrieval-Augmented Generation, RAG)技术通过结合大语言…...

rust-candle学习笔记13-实现多头注意力

参考:about-pytorch 定义结构体: use core::f32;use candle_core::{DType, Device, Result, Tensor}; use candle_nn::{embedding, linear_no_bias, linear, ops, Dropout, Linear, Module, VarBuilder, VarMap};struct MultiHeadAttention {w_qkv: Li…...

PyTorch API 5 - 全分片数据并行、流水线并行、概率分布

文章目录 全分片数据并行 (FullyShardedDataParallel)torch.distributed.fsdp.fully_shardPyTorch FSDP2 (fully_shard) Tensor Parallelism - torch.distributed.tensor.parallel分布式优化器流水线并行为什么需要流水线并行?什么是 torch.distributed.pipelining&…...

STL-list

一、 list的介绍 std::list 是 C 标准模板库(STL)中的一种双向链表容器。每个元素包含指向前后节点的指针,支持高效插入和删除操作,但随机访问性能较差。 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#x…...

WPF中如何自定义控件

WPF自定义控件简化版:账户菜单按钮(AccountButton) 我们以**“账户菜单按钮”为例,用更清晰的架构实现一个支持标题显示、渐变背景、选中状态高亮**的自定义控件。以下是分步拆解: 一、控件核心功能 我们要做一个类似…...

华为云Git使用与GitCode操作指南

案例介绍 本文档带领开发者学习如何在云主机上基于GitCode来使用Git来管理自己的项目代码,并使用一些常用的Git命令来进行Git环境的设置。 案例内容 1 概述 1.1 背景介绍 Git 是一个快速、可扩展的分布式版本控制系统,它拥有异常丰富的命令集,可以提供高级操作和对内部…...

UniRepLknet助力YOLOv8:高效特征提取与目标检测性能优化

文章目录 一、引言二、UniRepLknet 的框架原理(一)架构概述(二)架构优势 三、UniRepLknet 在 YOLOv8 中的集成(一)集成方法(二)代码实例 四、实验与对比(一)对…...

【软件工程】基于频谱的缺陷定位

基于频谱的缺陷定位(Spectrum-Based Fault Localization, SBFL)是一种通过分析程序执行覆盖信息(频谱数据)来定位代码中缺陷的方法。其核心思想是:通过测试用例的执行结果(成功/失败)和代码覆盖…...

stm32之IIC

目录 1.I2C1.1 简介1.2 硬件电路1.3 时序基本单元1.4 时序实例1.4.1 指定地址写1.4.2 当前地址读1.4.3 指定地址读 2.MPU60502.1 简介2.2 参数2.3 硬件电路2.4 框图2.5 文档 3.软件操作MPU60504.I2C通信外设4.1 简介4.2 I2C框图4.3 基本结构4.4 主机发送/接收4.5 软件/硬件波形…...

阿里云购买ECS 安装redis mysql nginx jdk 部署jar 部署web

阿里云服务维护 1.安装JDK 查询要安装jdk的版本,命令:yum -y list java* 命令:yum install -y java-1.8.0-openjdk.x86_64 yum install -y java-17-openjdk.x86_64 2.安装nginx 启用 EPEL 仓库 sudo yum install epel-release 安装 Nginx sudo yum …...

记录 ubuntu 安装中文语言出现 software database is broken

搜索出来的结果是 sudo apt-get install language-pack-zh-han* 然而,无效,最后手动安装如下 apt install language-pack-zh-hans apt install language-pack-zh-hans-base apt install language-pack-gnome-zh-hans apt install fonts-arphic-uming apt install libreoffic…...

质数和约数

一、知识和经验 把质数和约数放在一起就是因为他们有非常多的联系,为了验证这个观点我们可以先学习唯一分解定理:一个大于 1 的自然数一定能被唯一分解为有限个质数的乘积。 而且一个数不仅能被质数分解,原本也应该被自己的约数分解&#xf…...

OSPF的四种特殊区域(Stub、Totally Stub、NSSA、Totally NSSA)详解

OSPF的四种特殊区域(Stub、Totally Stub、NSSA、Totally NSSA)通过限制LSA的传播来优化网络性能,减少路由表规模。以下是它们的核心区别: 1. Stub 区域(末梢区域) 允许的LSA类型:Type 1-3&#…...

Docker中运行的Chrome崩溃问题解决

问题 各位看官是否在 Docker 容器中的 Linux 桌面环境(如Xfce)上启动Chrome ,遇到了令人沮丧的频繁崩溃问题?尤其是在打开包含图片、视频的网页,或者进行一些稍复杂的操作时,窗口突然消失?如果…...

【从零实现JsonRpc框架#3】线程模型与性能优化

1.Muduo 的线程模型 Muduo 基于 Reactor 模式 ,采用 单线程 Reactor 和 多线程 Reactor 相结合的方式,通过事件驱动和线程池实现高并发。 1. 单线程模型 核心思想 :所有 I/O 操作(accept、read、write)和业务逻辑均…...

Kubernetes资源管理之Request与Limit配置黄金法则

一、从"酒店订房"看K8s资源管理 想象你经营一家云上酒店(K8s集群),每个房间(Node节点)都有固定数量的床位(CPU)和储物柜(内存)。当客人(Pod&#…...

Windows 上使用 WSL 2 后端的 Docker Desktop

执行命令 docker pull hello-world 执行命令 docker run hello-world 执行命令 wsl -d Ubuntu...

OpenLayers根据任意数量控制点绘制贝塞尔曲线

以下是使用OpenLayers根据任意数量控制点绘制贝塞尔曲线的完整实现方案。该方案支持三个及以上控制点,使用递归算法计算高阶贝塞尔曲线。 实现思路 贝塞尔曲线原理:使用德卡斯特里奥算法(De Casteljau’s Algorithm)递归计算任意…...

使用 Jackson 在 Java 中解析和生成 JSON

JSON(JavaScript Object Notation)是一种轻量级、跨语言的数据交换格式,因其简单易读和高效解析而广泛应用于 Web 开发、API 通信和数据存储。在 Java 中,处理 JSON 是许多应用程序的核心需求,尤其是在与 RESTful 服务交互或管理配置文件时。Jackson 是一个功能强大且广受…...

Qt中在子线程中刷新UI的方法

Qt中在子线程中刷新UI的方法 在Qt中UI界面并不是线程安全的,意味着在子线程中不能随意操作UI界面组件(比如按钮、标签)等,如果强行操作这些组件有可能会导致程序崩溃。那么在Qt中如何在子线程中刷新UI控件呢? 两种方…...

封装 RabbitMQ 消息代理交互的功能

封装了与 RabbitMQ 消息代理交互的功能,包括发送和接收消息,以及管理连接和通道。 主要组件 依赖项: 代码使用了多个命名空间,包括 Microsoft.Extensions.Configuration(用于配置管理)、RabbitMQ.Client&a…...

关于ffmpeg的简介和使用总结

主要参考: 全网最全FFmpeg教程,从新手到高手的蜕变指南 - 知乎 (zhihu.com) FFmpeg入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。-CSDN博客 FFmpeg教程(超级详细版) - 个人文章 - S…...

计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 08.阴影

阴影 没有阴影的渲染效果如下,看起来不真实: 有阴影的渲染效果如下,看起来真实: 显示阴影有两种方式,一种是原书中的方式,另一种是采用光线追踪技术,该技术可以参考ShaderToy学习笔记 08.阴…...

[面试]SoC验证工程师面试常见问题(七)低速接口篇

SoC验证工程师面试常见问题(七)低速接口篇 摘要:低速接口是嵌入式系统和 SoC (System on Chip) 中常用的通信接口,主要用于设备间的短距离、低带宽数据传输。相比高速接口(如 PCIe、USB 3.0),低速接口的传输速率较低(通常在 kbps 到几 Mbps 范围),但具有简单…...

算法训练营第十三天|226.翻转二叉树、101. 对称二叉树、 104.二叉树的最大深度、111.二叉树的最小深度

递归 递归三部曲: 1.确定参数和返回值2.确定终止条件3.确定单层逻辑 226.翻转二叉树 题目 思路与解法 第一想法: 递归,对每个结点进行反转 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, le…...

电子电器架构 --- 车载网关的设计

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界…...

`C_PiperInterface` 类接口功能列表

C_PiperInterface 类接口功能列表 C_PiperInterface 提供了全面的接口,用于控制 Piper 机械臂的运动、查询状态、设置参数以及管理 SDK 限制。 官仓链接 以下是 C_PiperInterface 类中所有接口的功能总结: 1. 初始化与连接相关接口 __new__: 实现单例…...

D. Apple Tree Traversing 【Codeforces Round 1023 (Div. 2)】

D. Apple Tree Traversing 题目大意 有一个包含 n n n 个节点的苹果树,初始时每个节点上有一个苹果。你有一张纸,初始时纸上没有任何内容。 你需要通过以下操作遍历苹果树,直到所有苹果都被移除: • 选择一个苹果路径 ( u , v…...

Docker镜像搬运工:save与load命令的实战指南

在日常的容器化开发中,镜像的搬运和部署是每个开发者必须掌握的技能。今天我们将深入探讨Docker的"save"和"load"这对黄金搭档,揭秘它们在镜像管理中的妙用。 一、基础认知:镜像的打包与解包 docker save 和 docker loa…...

查看Electron 应用的调试端口

以下是一些可以知道已发布第三方 Electron 应用调试端口的方法: * **通过命令行参数查看** : * 如果该 Electron 应用在启动时添加了类似 --remote-debugging-portxxxx 或 --inspectxxxx 的参数,那么其调试端口就是该参数指定的端口号。比…...