MySQL 中的“雙路排序”與“單路排序”:原理、判別與實戰調優

一句話導讀
ORDER BY 不能走索引時,MySQL 會在 Server 層做一次 filesort。內部實現分 單路(全字段)雙路(rowid) 兩種;了解它們的觸發條件、判別方法與調優思路,是 SQL 性能優化的必修課。


一、為什么會有 filesort?

  • 當查詢無法利用 覆蓋索引索引順序 滿足 ORDER BY 時,MySQL 需要把結果集讀出來再排序。

  • 這個排序邏輯統稱 filesort,但它未必落盤,絕大多數情況下在內存完成。


二、單路 vs 雙路:一張圖看懂差異

階段單路排序 (Single-Pass)雙路排序 (Two-Pass)
讀取列所有查詢列一次性讀入 sort buffer只讀?排序鍵 + rowid
排序對象完整記錄<排序鍵, rowid>?二元組
回表不需要按 rowid?二次回表取整行
內存消耗高(存整行)低(只存鍵+id)
I/O 特征順序讀一次隨機讀兩次
典型觸發查詢列總字節 ≤?max_length_for_sort_data超過閾值或含大?TEXT/BLOB

三、內部流程拆解

  1. 單路排序

    1. 掃表/索引 → 把需要的 所有列 拷進 sort_buffer

    2. 在內存(或磁盤臨時文件)里按排序鍵快排/歸并

    3. 直接返回結果給客戶端

  2. 雙路排序

    1. 只取 排序鍵 + 聚簇主鍵(rowid) 進 sort buffer

    2. 排序后得到“排好序的 rowid 列表”

    3. 按 rowid 順序回表 取其余列 → 返回


四、如何查看 MySQL 使用了哪一種?

MySQL 不直接寫“單路/雙路”字樣,而是把信息藏在 optimizer traceEXPLAIN FORMAT=json 里。

方法 1:EXPLAIN FORMAT=json(MySQL 8.0 推薦)

EXPLAIN FORMAT=json
SELECT * FROM orders
WHERE order_date >= '2025-01-01'
ORDER BY total_amount DESC LIMIT 20\G

在輸出里查找:

"filesort_information": [{"sort_mode": "<sort_key, rowid>"          <-- 雙路/* 或 "<sort_key, additional_fields>" */  <-- 單路}
]
  • <sort_key, rowid> → 雙路

  • <sort_key, additional_fields><sort_key, packed_additional_fields> → 單路

方法 2:optimizer trace(所有版本通用)

-- 會話級開啟
SET optimizer_trace="enabled=on";
-- 執行目標 SQL
SELECT ... ORDER BY ...;
-- 查看 trace
SELECT * FROM information_schema.optimizer_trace\G

搜索關鍵字:

"filesort_summary": {"sort_mode": "<sort_key, rowid>"
}

含義同上。

方法 3:慢查詢日志 / performance_schema(線上無侵入)

  • MySQL 8.0.13+ 的 慢日志 JSON 會記錄 "sort_mode" 字段。

  • performance_schema 表 events_statements_history_long 中:

    • SUM_SORT_ROWS 累計排序行數

    • SUM_SORT_ROW_ID > 0 可側面反映雙路排序


五、調優策略速查表

目標手段
避免 filesort建立覆蓋索引?(order_col, ...),使?EXPLAIN?出現?Using index
保持單路減少查詢列寬度;避免?SELECT *;調大?max_length_for_sort_data
降低內存壓力若列過大,可接受雙路;或把大?TEXT/BLOB?拆子表延遲加載
加速排序調大?sort_buffer_size(會話級);確保?tmp_table_size/max_heap_table_size?足夠

示例調優:

-- 會話級只對當前連接生效
SET sort_buffer_size = 4*1024*1024;          -- 4 MB
SET max_length_for_sort_data = 4096;         -- 允許更長列走單路

六、實戰案例

場景:訂單寬表 orders 30+ 列,含 TEXT 備注字段。

  1. 初始 SQL:

SELECT * FROM orders
WHERE order_date >= '2025-01-01'
ORDER BY total_amount DESC
LIMIT 20;

EXPLAIN FORMAT=json 看到 "sort_mode": "<sort_key, rowid>",慢日志顯示 Sort_row_id: 125000
→ 觸發雙路+大量回表,耗時 1.2 s。

  1. 優化:

    • 去掉 * 只取需要的 5 列,列寬 < 3 KB

    • 新建復合索引 (order_date, total_amount DESC)覆蓋查詢列

  2. 結果:

    • EXPLAIN 出現 Using index; Using filesort 消失

    • 查詢降至 12 ms,CPU 降 90%。


七、結論

  1. 單路排序 用內存換 I/O,適合小字段;

  2. 雙路排序 用 I/O 換內存,適合大字段;

  3. 通過 EXPLAIN FORMAT=jsonoptimizer_trace 查看 sort_mode 即可判定;

  4. 真正的高性能優化是 讓排序走索引,徹底告別 filesort。

一句話:看不到 Using filesort,才是 ORDER BY 的終極答案。

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

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

相關文章

OpenLayers 綜合案例-信息窗體-彈窗

看過的知識不等于學會。唯有用心總結、系統記錄&#xff0c;并通過溫故知新反復實踐&#xff0c;才能真正掌握一二 作為一名摸爬滾打三年的前端開發&#xff0c;開源社區給了我飯碗&#xff0c;我也將所學的知識體系回饋給大家&#xff0c;助你少走彎路&#xff01; OpenLayers…

GaussDB 開發基本規范

1 集中式1.1數據庫價值特性推薦特性分類特性列表說明表類型PARTITION表數據分區存儲引擎行存儲按行順序存儲表&#xff0c;建議點查&#xff0c;增刪改操作較多場景下使用事務事務塊顯式啟動事務單語句事務不顯式啟動事務&#xff0c;單語句即為事務擴容在線擴容擴節點和數據重…

工作中使用git可能遇到的場景

1.main歷史發布版本出問題需要查看&#xff0c;怎么切換歷史發布版本&#xff1f;git reset --hard commitid 更新本地庫和代碼2.A分支的代碼已經做過一些功能&#xff0c;想遷移到B分支當前在A分支git checkout B &#xff08;切換到B分支&#xff09;git cherry-pick A的com…

【Spring AI】本地大型語言模型工具-Ollama

Ollama 是一個專注于在本地運行大型語言模型&#xff08;LLM&#xff09;的工具&#xff0c;支持多種開源模型&#xff08;如 Llama 3、Mistral、Gemma 等&#xff09;&#xff0c;提供簡單的命令行和 API 接口。<dependency><groupId>org.springframework.ai</…

電機S加減速

STM32步進電機S型加減速算法_stm32___build__-2048 AI社區 以上&#xff0c;電機加減速說的非常清楚&#xff0c;收藏點贊&#xff01;

一、初識 Linux 與基本命令

作者&#xff1a;IvanCodes 日期&#xff1a;2025年7月28日 專欄&#xff1a;Linux教程 思維導圖 一、Linux 簡介 1.1 什么是 Linux? Linux 是一種自由、開源的類Unix操作系統內核&#xff0c;由林納斯托瓦茲 (Linus Torvalds) 在1991年首次發布。我們通常所說的 “Linux 系統…

解決angular與jetty websocket 每30s自動斷連的問題

背景&#xff1a;前端&#xff1a;angular 12&#xff0c;websocket接口由lib.dom.d.ts提供后端&#xff1a;java&#xff0c;websocket接口由jetty 12提供問題現象&#xff1a;前端連上server后&#xff0c;每隔30s就會斷開&#xff0c;由于長時間空閑&#xff0c;會導致webso…

【機器學習深度學習】模型私有化部署與微調訓練:賦能特定問題處理能力

目錄 前言 一、私有化部署的背景&#xff1a;通用能力 ≠ 企業實用 暴露問題 二、微調訓練的核心目的 2.1 動作一&#xff1a;私有化部署&#xff08;Private Deployment&#xff09; 2.2 動作二&#xff1a;領域微調&#xff08;Domain Fine-Tuning&#xff09; 2.3 微…

Seq2Seq學習筆記

Seq2Seq模型概述Seq2Seq&#xff08;Sequence-to-Sequence&#xff09;是一種基于深度學習的序列生成模型&#xff0c;主要用于處理輸入和輸出均為序列的任務&#xff0c;如機器翻譯、文本摘要、對話生成等。其核心思想是將可變長度的輸入序列映射為另一個可變長度的輸出序列。…

react useId

useId useId 是 React 18 引入的一個內置 Hook&#xff0c;用于生成唯一且穩定的 ID &#xff0c; 主要用于&#xff0c;解決在客戶端和服務器端渲染&#xff08;SSR&#xff09;時&#xff0c;動態生成 ID 可能導致的沖突問題&#xff1b; 特別適合用于&#xff0c;需要關聯 H…

排水管網實時監測筑牢城市安全防線

排水管網的實時監測工作&#xff0c;強調其對于保障城市安全的重要作用。“排水管網”明確了具體的關注對象&#xff0c;它是城市基礎設施的重要組成部分&#xff0c;承擔著雨水、污水排放等關鍵功能。“實時監測”突出了監測的及時性和持續性&#xff0c;意味著能夠隨時獲取排…

SZU大學物理實驗報告|電位差計

寫在前面&#xff1a;博文里放圖片&#xff0c;主要省去了對文檔的排版時間&#xff0c;實驗還是要自己做的&#xff0c;反正都要去實驗室上課&#xff0c;順帶鍛煉下動手能力。有些結果是實驗手寫的&#xff0c;所以看不到&#xff0c;有結果的可以對下結果差的不太多就行&…

RoPE簡單解析

文章目錄簡介拆解一些tricks簡介 因為RoPE的優異性能&#xff0c;其已成為各種大模型中位置編碼的首選&#xff0c;包括多模態模型&#xff1b;在一些多模態模型或視頻理解模型中&#xff0c;甚至會用到多維度RoPE。雖然RoPE已廣泛應用&#xff0c;之前也看了不少針對其原理解…

windows 獲取 APK 文件的包名和啟動 Activity 名稱

使用 aapt 命令確保環境變量配置正確&#xff1a;首先需要確保你的系統環境變量中包含了 Android SDK 的 build-tools 目錄路徑。這是因為 aapt 工具位于該目錄下。運行命令&#xff1a; 打開命令提示符&#xff08;CMD&#xff09;&#xff0c;然后輸入以下命令來查看 APK 的詳…

【Mac版】Linux 入門命令行快捷鍵+聯想記憶

Linux Mac 用戶終端命令行快捷鍵 符號速查全解作為一個剛接觸 Linux 和終端的 macOS 用戶&#xff0c;常常被命令行的各種快捷鍵和符號弄得頭暈腦脹&#xff0c;本文將帶你系統地掌握命令行中最常用的快捷鍵和符號&#xff0c;并通過邏輯聯想幫助你輕松記住每一個組合。一、基…

AUTOSAR Mcal Dio - 模塊介紹 + EB配置工具介紹

文章目錄1. 模塊簡介2. 主要功能3. 縮略語4. API接口5. 功能介紹5.1. ChannelGroup5.2. Dio_MaskedWritePort6. 序列圖6.1.讀GPIO電平6.2. 設置GPIO電平7. EB 工具配置7.1.General7.2.DioPort8. 參考資料1. 模塊簡介 Dio&#xff0c;全稱“Digital Input Output”。Dio模塊&am…

ICT模擬零件測試方法--晶體管測試

ICT模擬零件測試方法–晶體管測試 文章目錄ICT模擬零件測試方法--晶體管測試晶體管測試晶體管測試配置晶體管測試配置晶體管測量選項晶體管測試 i3070 在線測試軟件為每個晶體管提供兩種測試&#xff1a; 使用二極管測試對晶體管的兩個 PN 結進行測試。這是檢查設備存在的快速…

AI算法實現解析-C++實例

基于C++實現的AI 以下是基于C++實現的AI/機器學習相關示例,涵蓋基礎算法、計算機視覺、自然語言處理等領域,適合不同階段的學習者參考: 基礎機器學習算法 線性回歸 使用梯度下降法預測連續值,核心公式: 損失函數: 邏輯回歸 二分類問題實現,Sigmoid函數: K-Means…

亞馬遜云科技實戰架構:構建可擴展、高效率、無服務器應用

對于今天的開發者、架構師和技術愛好者而言&#xff0c;云計算早已超越了簡單的“虛擬機租賃”或“服務器托管”階段。它已經演化為一套豐富、強大且精密的工具集&#xff0c;能夠以前所未有的方式設計、部署和擴展應用程序。真正的云原生思維&#xff0c;是掌握并運用多種架構…

論文閱讀:《無約束多目標優化的遺傳算法,群體和進化計算》

前言 提醒&#xff1a; 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布&#xff0c;其中引用內容都會使用鏈接表明出處&#xff08;如有侵權問題&#xff0c;請及時聯系&#xff09;。 其中內容多為一次書寫&#xff0c;缺少檢查與訂正&#xff0c;如有問題或其他拓展…