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 工具進行分析,你就能更有效地提升數據庫查詢性能!

希望這篇詳細的講解對你有所啟發!祝你的數據庫查詢越來越快!🚀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80237.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80237.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80237.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

awesome-digital-human本地部署及配置:打造高情緒價值互動指南

在數字化交互的浪潮中,awesome-digital-human-live2d項目為我們打開了本地數字人互動的大門。結合 dify 聊天 api,并借鑒 coze 夸夸機器人的設計思路,能為用戶帶來充滿情緒價值的交互體驗。本文將詳細介紹其本地部署步驟、dify 配置方法及情緒…

[ctfshow web入門] web68

信息收集 highlight_file被禁用了,使用cinclude("php://filter/convert.base64-encode/resourceindex.php");讀取index.php,使用cinclude("php://filter/convert.iconv.utf8.utf16/resourceindex.php");可能有些亂碼,不…

計算機網絡:深度解析基于鏈路狀態的內部網關協議IS-IS

IS-IS(Intermediate System to Intermediate System)路由協議詳解 IS-IS(Intermediate System to Intermediate System)是一種基于鏈路狀態的內部網關協議(IGP),最初由ISO為OSI(開放系統互連)模型設計,后經擴展支持IP路由。它廣泛應用于大型運營商網絡、數據中心及復…

SEGGER項目

SystemView 查看版本, 查看SEGGER官網,release時間是2019-12-18日, 而3.12.0的版本日期是2020-05-04 #define SEGGER_SYSVIEW_MAJOR 3 #define SEGGER_SYSVIEW_MINOR 10 #define SEGGER_SYSVIEW_REV 0SEGGER EMBEDDED Studio 根據S…

Linux——Mysql索引和事務

目錄 一,Mysql索引介紹 1,索引概述 1,索引的優點 2,索引的缺點 2,索引作用 3,索引分類 普通索引 唯一索引 主鍵索引 組合索引 全文索引 4,查看索引 5,刪除索引 6&…

【Web】LACTF 2025 wp

目錄 arclbroth lucky-flag whack-a-mole arclbroth 看到username為admin能拿到flag 但不能重復注冊存在的用戶 這題是secure-sqlite這個庫的問題,底層用的是C,沒處理好\0字符截斷的問題 (在 Node.js 中,由于其字符串表示方式…

訪問者模式(Visitor Pattern)詳解

文章目錄 1. 訪問者模式概述1.1 定義1.2 基本思想 2. 訪問者模式的結構3. 訪問者模式的UML類圖4. 訪問者模式的工作原理5. Java實現示例5.1 基本實現示例5.2 訪問者模式處理復雜對象層次結構5.3 訪問者模式在文件系統中的應用 6. 訪問者模式的優缺點6.1 優點6.2 缺點 7. 訪問者…

matlab介紹while函數

MATLAB 中的 while 語句介紹 在 MATLAB 中,while 語句是一種循環結構,用于在滿足特定條件時反復執行一段代碼塊。與 for 循環不同,while 循環的執行次數是動態的,取決于循環條件是否為真。 語法 while condition% 循環體代碼 e…

數字信號處理|| 快速傅里葉變換(FFT)

一、實驗目的 (1)加深對快速傅里葉變換(FFT)基本理論的理解。 (2)了解使用快速傅里葉變換(FFT)計算有限長序列和無限長序列信號頻譜的方法。 (3)掌握用MATLA…

.Net Mqtt協議-MQTTNet(一)簡介

一、MQTTNet 簡介 MQTTnet 是一個高性能的MQTT類庫,支持.NET Core和.NET Framework。 二、MQTTNet 原理 MQTTnet 是一個用于.NET的高性能MQTT類庫,實現了MQTT協議的各個層級,包括連接、會話、發布/訂閱、QoS(服務質量&#xff0…

時鐘晶振鎖相環pll方向技術要點和大廠題目解析

本專欄預計更新60期左右。當前第9期。 本專欄不僅適用于硬件的筆試面試,同樣也適用于梳理硬件核心的知識點。 通過本文能得到什么? 首先,根據實戰經驗總結時鐘晶振,鎖相環的主要知識點,技術要點,面試考點; 然后,列出時鐘晶振,鎖相環的筆試面試的主要題型真題和模擬題,…

機器學習 day6 -線性回歸練習

題目?: 從Kaggle的“House Prices - Advanced Regression Techniques”數據集使用Pandas讀取數據,并查看數據的基本信息。選擇一些你認為對房屋價格有重要影響的特征,并進行數據預處理(如缺失值處理、異常值處理等)。…

緩存(2):數據一致性

概述 一致性就是數據保持一致,在分布式系統中,可以理解為多個節點中數據的值是一致的。 強一致性:這種一致性級別是最符合用戶直覺的,它要求系統寫入什么,讀出來的也會是什么,用戶體驗好,但實現起來往往對系統的性能影響大弱一致性:這種一致性級別約束了系統在寫入成功…

CH579 CH573 CH582 CH592 藍牙主機(Central)實例應用講解

藍牙主機(Central),顧名思義,就是一個藍牙主設備,與從機(Peripheral)建立連接進行通信,可以接收從機通知,也可以給從機發送信息,通常Central和Peripheral結合…

不同類型的 SAP 項目

目錄 1 實施項目 2 SAP S/4 HANA 升級項目 3 數據遷移項目 4 優化項目 5 Rollout 項目 6 運維項目 1 實施項目 企業第一次用 SAP 系統,從硬件搭建到安裝 SAP、根據業務流程做配置、開發、培訓業務、測試系統直到系統上線。 SAP S/4 HANA ACTIVATE 實施方法論…

【uniapp】errMsg: “navigateTo:fail timeout“

項目場景: 在點擊編輯的時候不能跳轉的編輯的頁面,然后直接報錯errMsg: "navigateTo:fail timeout" 解決方案: 看看是否是出現了盒子的冒泡事件導致了兩次調用跳轉路徑 tap.stop

記錄學習的第三十五天

今天主攻單源最短路Dijkstra算法。不過,還是沒有完全掌握。 首先是書本的例題我理解了一遍。 然后其實在力扣上做了三道題的,但是我看題解的情況就不太會。然后試著用上面的方法敲了一下↓的題,但是不對啊,我也不知道為什么呀。

Spring-博客系統項目

一,實現效果 登錄: 注冊: 博客列表 個人博客中心 博客詳情: 更新博客 編寫博客 二,數據庫的建立和連接 首先,需要建庫,需要兩個實體,一個是用戶,一個是博客,需要如下屬性,需要注意的是需要將密碼的變長字符創設置的長一些,因為之后會對用戶的密碼進行加密,該博客中密碼…

依賴注入詳解與案例(前端篇)

依賴注入詳解與案例(前端篇) 一、依賴注入核心概念與前端價值 依賴注入(Dependency Injection, DI) 是一種通過外部容器管理組件/類間依賴關系的設計模式,其核心是控制反轉(Inversion of Control, IoC&…

diy裝機成功錄

三天前,我正式開啟了這次裝機之旅,購入了一顆性能強勁的 i5-12400 CPU,一塊繪圖能力出色的 3060ti 顯卡,還有技嘉主板、高效散熱器、16G 內存條、2T 固態硬盤,以及氣派的機箱和風扇,滿心期待能親手打造一臺…