精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官:MySQL 中的排序是怎么實現的?

數據庫 MySQL
假設你正在開發一個電商平臺的訂單系統,產品經理要求:用戶進入"我的訂單"頁面時,需要按下單時間倒序展示最近的 20 條訂單。

參考回答

MySQL 的數據排序主要通過兩種方式實現:索引排序和文件排序(filesort)。

首先是索引排序,這是最高效的方式。當我們的 ORDER BY 子句中使用的字段恰好有索引,并且索引的順序與排序要求一致時,MySQL 會直接利用索引的有序性返回結果,完全不需要額外的排序操作。這種方式在執行0計劃中不會出現 "Using filesort" 標識。

其次是文件排序,當無法利用索引時,MySQL 會啟用 filesort 機制。這個過程會根據待排序數據量的大小采用不同策略:

  1. 內存排序階段:如果數據量較小,能夠放入 sort_buffer(由參數 sort_buffer_size 控制)中,就在內存中完成排序。內存排序又分為兩種模式:
  • 單路排序(全字段排序) :直接把查詢需要的所有字段都讀到 sort_buffer 中進行排序,排完直接返回,避免回表
  • **雙路排序(rowid 排序)**:當單行數據過大時(超過 max_length_for_sort_data),只讀取排序字段和主鍵 ID 到 sort_buffer,排序完成后再回表查詢其他字段
  1. 磁盤排序階段:如果數據量超過 sort_buffer 容量,MySQL 會使用歸并排序算法,將數據分批次在內存中排序后寫入臨時文件,最后再將多個有序文件合并,這個過程會涉及大量磁盤 IO,性能較差。

判斷使用哪種排序方式的關鍵因素包括:是否有合適的索引、數據量大小、sort_buffer_size 參數、max_length_for_sort_data 參數等。所以,在實際優化中,我們應該優先考慮建立合適的索引來避免 filesort,如果必須使用 filesort,則需要合理調整相關參數以盡量在內存中完成排序。

圖片圖片

一、從一個場景說起

假設你正在開發一個電商平臺的訂單系統,產品經理要求:用戶進入"我的訂單"頁面時,需要按下單時間倒序展示最近的 20 條訂單。你很快寫出了這樣的查詢語句:

SELECT order_id, user_id, order_time, total_amount 
FROM orders 
WHERE user_id = 10086 
ORDER BY order_time DESC 
LIMIT 20;

這個看似簡單的查詢,背后卻隱藏著 MySQL 復雜的排序機制。當你用 EXPLAIN 分析這條 SQL 時,可能會看到兩種截然不同的結果:一種是干凈利落,直接走索引;另一種則出現了 "Using filesort" ,使用了文件排序。

這兩種情況的性能差異可能達到幾十倍甚至上百倍。為什么會有這樣的差異?MySQL 內部到底是如何處理排序的?下面,我們從最底層的原理開始剖析。

二、索引排序

2.1 索引天然有序

很多開發者都知道索引能加速查詢,遇事不決加索引,因為索引有一個重要特性:索引本身就是有序的。

在 InnoDB 存儲引擎中,索引采用 B+ 樹結構。這種樹的葉子節點按照索引鍵值從左到右串聯成一個有序鏈表。當你在 order_time 字段上建立索引后,MySQL 實際上已經維護了一個按時間排序的"目錄"。

想象一下圖書館的書籍編目系統:如果圖書已經按照出版時間在書架上從左到右排列好了,當讀者要求"給我最近出版的 20 本書"時,管理員只需要從最右邊取 20 本即可,完全不需要把所有書搬出來重新排序。

2.2 觸發索引排序的條件

但索引排序并非萬能鑰匙,它的觸發需要滿足嚴苛的條件:

1)索引列順序必須與 ORDER BY 順序完全匹配

假設你建立了一個聯合索引 INDEX idx_user_time(user_id, order_time)。這個索引的存儲結構是先按 user_id 排序,user_id 相同時再按 order_time 排序。

此時如果你的查詢是:

-- ? 能用索引排序
WHERE user_id = 10086 ORDER BY order_time

-- ? 不能用索引排序
ORDER BY order_time, user_id  -- 順序顛倒
2) 排序方向必須一致
-- ? 都是升序或都是降序
ORDER BY order_time DESC, status DESC

-- ? 方向不一致
ORDER BY order_time DESC, status ASC

MySQL 8.0 之前的版本無法利用索引處理方向不一致的排序,因為索引只能單向掃描。就像電梯要么向上要么向下,不能一邊上一邊下。在MySQL 8.0 之后的版本對索引排序能力進行了重要優化,支持利用索引處理方向不一致的排序(即對聯合索引中不同字段使用 ASC 和 DESC 混合排序),無需額外的文件排序(filesort)。

8.0 之前的限制:聯合索引的物理存儲是 “單向有序” 的(例如 (a ASC, b ASC)),只能按索引定義的方向掃描。如果查詢中排序方向與索引定義不一致(如 ORDER BY a ASC, b DESC),索引無法直接滿足排序需求,會觸發文件排序。

8.0 及之后的優化:引入了 “降序索引”(descending index)支持,允許在創建聯合索引時為每個字段指定排序方向(ASC 或 DESC),且優化器能利用這類索引處理混合方向的排序。

  • 例如,若創建索引 INDEX idx_mixed(a ASC, b DESC),則查詢 ORDER BY a ASC, b DESC 可直接通過索引掃描返回有序結果。
  • 即使索引定義為全 ASC(如 (a ASC, b ASC)),8.0 優化器也能反向掃描索引(從后向前讀),來滿足 ORDER BY a DESC, b DESC 這類同方向倒序的需求,無需文件排序。

注意事項:

  • 降序索引僅支持 InnoDB 存儲引擎。
  • 混合排序的字段順序仍需遵循聯合索引的 “最左前綴原則”(如索引 (a, b) 可支持 ORDER BY a ASC, b DESC,但不支持 ORDER BY b ASC, a DESC)。
3)WHERE 條件與 ORDER BY 字段的配合

當查詢既有 WHERE 過濾又有 ORDER BY 排序時,索引必須同時滿足兩者的需求。最優情況是建立覆蓋索引,把 WHERE、ORDER BY、SELECT 涉及的字段都包含進去。

2.3 優化器的權衡

即使滿足了上述所有條件,MySQL 優化器仍然可能選擇不用索引排序。這是因為優化器會計算"成本"。

假設你的查詢需要返回 100 萬條數據,雖然有索引可以保證有序,但每條數據都需要回表查詢(因為索引中只有排序字段,其他字段在主鍵索引上)。優化器一算:這得回表 100 萬次!還不如直接全表掃描,把所有數據讀到內存里排序一次。

這就是為什么你會看到一些"明明有索引卻不用"的詭異現象。優化器并非不智能,而是在做綜合權衡。

三、文件排序

3.1 filesort 的觸發時機

當下面任何一個條件成立時,MySQL 就會放棄索引排序,啟動 filesort 機制:

  1. 排序字段沒有索引
  2. 索引無法覆蓋所有查詢字段(需要大量回表)
  3. ORDER BY 使用了表達式或函數(如 ORDER BY YEAR(order_time))
  4. 多表關聯查詢的復雜排序
  5. 優化器評估索引排序成本過高

在執行計劃的 Extra 列中出現 "Using filesort",就是 MySQL 在告訴你:"我得自己排序了"。

3.2 sort_buffer:排序的臨時工作區

MySQL 會為每個需要排序的查詢分配一塊內存區域,叫做 sort_buffer(排序緩沖區)。這塊內存的大小由參數 sort_buffer_size 控制,默認值通常是 256KB。

這塊內存是會話級別的,意味著每個客戶端連接都有自己獨立的 sort_buffer。如果你的系統有 1000 個并發連接,每個連接的 sort_buffer 設置為 4MB,理論上就需要 4GB 內存來支撐排序操作。

sort_buffer 的工作流程像這樣:

  • MySQL 根據 WHERE 條件篩選出需要排序的記錄
  • 將這些記錄的相關字段讀入 sort_buffer
  • 在 sort_buffer 中使用快速排序算法進行排序
  • 返回排序后的結果

關鍵問題來了:如果數據量太大,sort_buffer 裝不下怎么辦?

3.3 單路排序

這是 MySQL 默認采用的排序方式。它的核心思想是:把查詢需要的所有字段都讀到 sort_buffer 中,排序完成后直接返回,不需要再回表。

假設你的查詢是:

SELECT order_id, user_id, order_time, total_amount, status 
FROM orders 
WHERE user_id = 10086 
ORDER BY order_time DESC 
LIMIT 20;

單路排序的執行過程:

  1. 掃描定位:根據 user_id = 10086 的條件,找到所有符合的記錄(假設有 5000 條)
  2. 字段提取:對每條記錄,提取 order_id、user_id、order_time、total_amount、status 這五個字段的值
  3. 裝載緩沖區:將這 5000 條記錄的五個字段全部裝入 sort_buffer
  • 如果 5000 條數據占用空間小于 sort_buffer_size(比如 256KB),全部裝入內存
  • 如果超過了,就需要使用外部排序
  1. 內存快排:在 sort_buffer 中對這 5000 條數據按 order_time 進行快速排序
  2. 取出結果:排序完成后,取前 20 條返回給客戶端

這種方式的優點是一次性完成,不需要回表,缺點是占用內存較大。如果單行數據很寬(比如包含大字段),很容易超過 sort_buffer 限制。

3.4 雙路排序(rowid 排序):空間換時間

當單行數據太大時,MySQL 會切換到雙路排序模式。判斷標準是參數 max_length_for_sort_data,默認值是 4096 字節。

如果參與排序的單行數據長度超過這個閾值,就會觸發雙路排序。

雙路排序的思路是:只把排序字段和主鍵 ID 讀到 sort_buffer,排序完成后再回表查詢其他字段。

還是剛才的例子,執行過程變成:

  • 掃描定位:找到 user_id = 10086 的 5000 條記錄
  • 精簡提取:對每條記錄,只提取 order_time(排序字段)和 order_id(主鍵)兩個字段
  • 裝載緩沖區:將 5000 條記錄的兩個字段裝入 sort_buffer

因為只有兩個字段,占用空間大大減少,更容易在內存中完成

  • 內存快排:按 order_time 排序這 5000 條數據
  • 取出前 20:排序后選出前 20 條的 order_id
  • 回表查詢:根據這 20 個 order_id,回到主鍵索引上查詢完整的記錄(包括 user_id、total_amount、status)
  • 返回結果:將查詢到的 20 條完整記錄返回客戶端

這種方式的優點是占用內存小,更容易在內存中完成排序,缺點是需要額外的回表操作。

不過仔細想想,回表只針對最終返回的 20 條數據,而不是全部 5000 條,所以這個代價是可以接受的。如果沒有 LIMIT 限制,需要返回全部 5000 條,那回表代價就很高了。

責任編輯:武曉燕 來源: 玄武后端技術棧
相關推薦

2025-04-14 11:41:12

RocketMQ長輪詢配置

2024-10-15 10:00:06

2024-12-30 13:58:14

2021-09-27 07:11:18

MySQLACID特性

2024-12-25 15:44:15

2024-02-04 10:08:34

2025-10-21 08:06:20

2023-02-08 07:04:20

死鎖面試官單元

2024-06-06 11:57:44

2025-09-03 04:00:00

小紅書Feed流系統

2025-02-26 12:19:52

2025-10-17 09:49:07

2022-02-09 09:37:54

ReactorNettyI/O

2025-04-08 00:00:00

@AsyncSpring異步

2024-05-11 15:11:44

系統軟件部署

2021-02-19 10:02:57

HTTPSJava安全

2024-04-19 08:23:06

2015-08-13 10:29:12

面試面試官

2024-09-20 08:36:43

零拷貝數據傳輸DMA

2024-03-22 06:56:24

零拷貝技術數據傳輸數據拷貝
點贊
收藏

51CTO技術棧公眾號

日本欧美一区二区三区| 久久99国产成人小视频| 亚洲影院在线观看| 久久99精品国产一区二区三区| 久久免费激情视频| 国模精品一区| 91精品国产综合久久久久久久久久| 玖玖精品在线视频| 三级在线观看| 国产一区视频网站| 2020久久国产精品| 成人做爰视频网站| 亚洲高清极品| 777a∨成人精品桃花网| 国产白丝袜美女久久久久| 亚洲xxxxxx| 波波电影院一区二区三区| 国产精品美女久久久免费| 欧美成人精品欧美一| 精品国产91久久久久久浪潮蜜月| 欧美一级爆毛片| 777米奇影视第四色| 二区三区四区高清视频在线观看| 99精品国产热久久91蜜凸| 国产一区二区在线免费视频| 丁香六月婷婷综合| 欧美成人69av| 国产亚洲精品久久久优势| 在线观看一区二区三区视频| 成人精品三级| 黑人巨大精品欧美一区二区免费| 中文字幕在线亚洲三区| 天堂a中文在线| 国产精品一级黄| 国产精品美女免费| 久久国产精品免费看| 综合国产在线| 日韩视频永久免费观看| wwwwww日本| 超碰地址久久| 欧美一区二区在线观看| 亚洲高清在线免费观看| 欧美片第一页| 狠狠久久亚洲欧美专区| 日韩精品在线中文字幕| 18视频在线观看网站| 亚洲欧洲av色图| 天天综合狠狠精品| 欧美777四色影视在线| 成人av午夜电影| 91久久久一线二线三线品牌| 国产精品久久久久久无人区| 免费成人在线观看| 国产精品igao视频| 无码人妻熟妇av又粗又大 | 在线看成人av电影| 97在线观看免费观看高清 | 蜜桃网站成人| 涩爱av在线播放一区二区| 成人毛片老司机大片| 国产精品欧美久久| 日韩中文字幕免费观看| 成人黄色国产精品网站大全在线免费观看| 亚洲一区二区中文| 精品国产伦一区二区三| 国产不卡视频在线观看| 国产aⅴ精品一区二区三区黄| 亚洲av永久无码国产精品久久| 国产精品一区一区| http;//www.99re视频| 欧日韩在线视频| 99久久久国产精品免费蜜臀| 久久婷婷人人澡人人喊人人爽| 深夜福利在线看| 久久久久久久综合狠狠综合| 亚洲国产欧美日韩| 超碰在线免费播放| 亚洲午夜免费视频| 日韩免费一级视频| 成人va天堂| 91精品蜜臀在线一区尤物| 在线观看欧美一区二区| 欧洲精品一区| 揄拍成人国产精品视频| 麻豆精品国产免费| 伊人久久大香线蕉综合热线| 2019亚洲日韩新视频| 欧美国产一级片| 国产毛片精品国产一区二区三区| 国产欧美一区二区视频| 国产一区精品| 亚洲自拍偷拍麻豆| 国产女女做受ⅹxx高潮| 四虎精品一区二区免费| 亚洲国产福利在线| 大吊一区二区三区| 亚洲午夜在线| 国产成人福利视频| 国产日本精品视频| 久久综合色8888| 亚洲一区二区三区乱码 | 亚洲精品日韩一| 黄色成人在线看| 国产一区二区三区影视| 日韩午夜在线播放| 中字幕一区二区三区乱码 | 亚洲熟妇av一区二区三区| 欧美一级在线| 日韩电视剧在线观看免费网站| 女人黄色一级片| 亚洲黄色天堂| 91久久夜色精品国产网站| 天天色综合av| 亚洲精品国产无天堂网2021| 韩国日本在线视频| 国产精品chinese在线观看| 中文字幕国产亚洲2019| 日韩美女黄色片| 国产综合成人久久大片91| 欧美日韩精品一区| 国精一区二区三区| 在线观看91av| 精品无码人妻一区二区免费蜜桃 | 九九热99久久久国产盗摄| 精品不卡一区二区| 成人av电影在线| 黄色网址在线免费看| 国产亚洲精品精品国产亚洲综合| 精品国产成人在线影院| 成熟的女同志hd| 美腿丝袜在线亚洲一区| 欧美一区二区高清在线观看| 黑森林国产精品av| 精品电影一区二区三区| 国产高潮国产高潮久久久91| 免费观看久久久4p| 亚洲成人一区二区三区| 我爱我色成人网| 日韩精品免费观看| 99久在线精品99re8热| 成人综合婷婷国产精品久久 | 91原创国产| 麻豆传媒在线免费看| 欧美日韩视频在线观看一区二区三区| 成人h动漫精品一区| 99精品国产在热久久下载| 岛国一区二区三区高清视频| 影院在线观看全集免费观看| 欧美一区二区免费| 婷婷色中文字幕| 国产一区亚洲一区| 日本中文字幕一级片| 国产一区二区三区亚洲综合| 超碰97人人做人人爱少妇| 一区二区 亚洲| 亚洲欧洲av在线| av在线免费观看不卡| 婷婷另类小说| 91九色国产视频| 成人av福利| 日韩一卡二卡三卡四卡| 久久久久久久久久久久久久免费看 | 欧美啪啪免费视频| 婷婷综合电影| 国产精品1区2区在线观看| 春暖花开成人亚洲区| 欧美丝袜自拍制服另类| 日本不卡一二区| 国产精品综合在线视频| 国产日韩亚洲欧美在线| 国产亚洲精品美女久久| 1769国产精品| 国产精品一区在线看| 欧美日韩一区二区在线观看| 娇小11一12╳yⅹ╳毛片| 国产麻豆午夜三级精品| av免费观看国产| 猛男gaygay欧美视频| 国产精品日韩欧美| 91中文在线| 亚洲精品国产电影| 中文在线观看av| 亚洲欧洲www| 中文字幕在线视频播放| 日韩国产在线一| japanese在线视频| 第一区第二区在线| 国产不卡精品视男人的天堂| 日本在线看片免费人成视1000| 日韩一二三区视频| 日韩免费不卡视频| 国产精品欧美一区喷水| 精人妻一区二区三区| 视频一区二区欧美| 国产卡一卡二在线| 女仆av观看一区| 国产精品夜色7777狼人| 99久久精品免费看国产小宝寻花 | 欧美在线你懂的| 久久久国产成人| 国产视频在线观看一区二区三区| 免费看的av网站| 美女久久一区| 嫩草影院中文字幕| 成人羞羞网站入口| 国产视频在线观看一区| 欧美jizz18| 欧美野外猛男的大粗鳮| av理论在线观看| 亚洲网址你懂得| 成人午夜视频一区二区播放| 精品视频1区2区3区| 在线观看亚洲欧美| 亚洲四区在线观看| 国产精成人品免费观看| 成人性色生活片免费看爆迷你毛片| 国产免费999| 99香蕉国产精品偷在线观看| av中文字幕av| 国产精品成人a在线观看| 欧美一区国产一区| 成人搞黄视频| 9a蜜桃久久久久久免费| 亚洲狼人综合| 国产精品免费久久久久久| 国产污视频在线播放| 欧美老肥婆性猛交视频| 日韩大片在线永久免费观看网站| 亚洲老司机av| 亚洲欧美日本在线观看| 精品久久五月天| 国产视频第一页| 欧美人伦禁忌dvd放荡欲情| 亚洲成人第一网站| 欧美丝袜第一区| 日韩视频免费观看高清| 洋洋成人永久网站入口| 精品无码一区二区三区蜜臀| 国产精品丝袜黑色高跟| 中文字幕免费在线看线人动作大片| 9色porny自拍视频一区二区| 污网站免费观看| 成人免费视频播放| 国产精品一区二区在线免费观看| 国产精品伊人色| aaaaa黄色片| 国产成人一区在线| 又色又爽又黄18网站| 国产福利精品导航| 国产精九九网站漫画| 国产不卡免费视频| 免费观看一区二区三区| 成人深夜在线观看| 污污污www精品国产网站| 成人avav影音| 黄色正能量网站| 国产亚洲人成网站| 九九九视频在线观看| 国产精品乱码人人做人人爱| 免费黄色国产视频| 亚洲欧美偷拍另类a∨色屁股| 四虎免费在线视频| 亚洲成人av一区| 天堂а√在线中文在线新版| 91黄色免费版| 888奇米影视| 欧美大片一区二区| 午夜av免费观看| 伊人亚洲福利一区二区三区| 日本电影在线观看网站| 欧美成人四级hd版| 国产精品一二三产区| 日韩av片永久免费网站| 国产精品4hu.www| 亚洲一区二区三区乱码aⅴ| 伊人精品久久| 欧美日韩另类综合| 99精品网站| 久久av综合网| 丝袜美腿亚洲一区二区图片| 三上悠亚av一区二区三区| 国产精品自拍三区| 一区二区三区免费在线观看视频| 日本一区二区不卡视频| 国产1区2区3区4区| 欧美午夜片在线免费观看| 伊人久久成人网| 精品国产伦理网| 国产在线一二三| 毛片精品免费在线观看| 中文字幕乱码中文乱码51精品| 国产精品免费在线免费| 97久久综合精品久久久综合| 日本视频一区二区在线观看| 欧美一区二区| 蜜臀久久99精品久久久酒店新书| 精品一区二区av| 风间由美一二三区av片| 自拍偷自拍亚洲精品播放| 国产黄色片免费看| 欧美福利视频一区| 深夜福利视频在线免费观看| 菠萝蜜影院一区二区免费| 天堂资源在线| 91久久国产自产拍夜夜嗨| 欧美日韩一二三四| ww国产内射精品后入国产| 激情图片小说一区| 欧美黄色激情视频| 亚洲成年人网站在线观看| 91久久国语露脸精品国产高跟| 国产网站欧美日韩免费精品在线观看 | 国产精品久免费的黄网站| 欧美一区二区三区人| 成全电影播放在线观看国语| 97国产精品视频人人做人人爱| 亚洲一区有码| 日本不卡久久| 国产精品一二| 91成人在线观看喷潮蘑菇| 国产精品久久久久久久久果冻传媒 | 永久看看免费大片| 中文字幕精品一区| 国产成人无码一区二区在线播放| 精品欧美一区二区三区精品久久 | 性做久久久久久久久久| 深夜福利国产精品| av有声小说一区二区三区| 加勒比在线一区二区三区观看 | 亚洲欧洲日产国码无码久久99| 国产剧情一区在线| 可以免费看av的网址| 欧美视频在线观看一区| 韩国中文免费在线视频| 欧美亚洲日本网站| 日韩美女精品| 成 年 人 黄 色 大 片大 全| 成人深夜视频在线观看| 久久久久黄色片| 日韩精品一区二区三区视频| 老司机在线看片网av| 91精品久久久久久| 欧美jizz| 第一区免费在线观看| 亚洲欧洲av一区二区三区久久| 91国在线视频| 久久亚洲精品成人| 精品精品视频| 996这里只有精品| 国产98色在线|日韩| 久草免费新视频| 精品国产乱码久久久久久影片| 在线欧美三级| 成人在线视频电影| 91久久久久| 国产ts丝袜人妖系列视频| 欧美日韩一二三四五区| 日本黄在线观看| 国产高清在线不卡| 成人激情视频| 韩国一区二区在线播放| 一区二区三区毛片| 五月天福利视频| 国产精品成人观看视频国产奇米| 精品国产一区探花在线观看| 亚州精品一二三区| 亚洲男帅同性gay1069| 超碰人人人人人人| 97香蕉久久夜色精品国产| 岳的好大精品一区二区三区| 爱情岛论坛亚洲首页入口章节| 中文字幕永久在线不卡| 午夜精品一二三区| 欧美在线视频播放| 欧美一二区在线观看| 中文字幕第66页| 亚洲va欧美va人人爽午夜| 黄色片视频在线观看| 91精品久久久久久久久久| 欧美激情无毛| 国精品无码人妻一区二区三区| 欧美视频精品在线观看| 香蕉久久aⅴ一区二区三区| 激情视频在线观看一区二区三区| 天堂影院一区二区| 中文字幕在线2021| 日韩av在线看| 香蕉久久一区| 91专区在线观看| 国产精品成人网| 日本免费网站在线观看| 国产精品美女www| 亚洲第一黄色| 亚洲色图27p| 亚洲大尺度美女在线| 成人黄色在线| 国产男女免费视频| 国产精品久久久久久久久久免费看| 欧美视频xxx| 成人在线视频网站|