精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲一区二区三区高清| 天堂av一区| 亚洲国产精品精华液ab| 国产色综合天天综合网 | 91麻豆成人久久精品二区三区| 国产91av在线| 三上悠亚在线观看视频| 国产91精品入| 精品视频一区三区九区| 成年人视频大全| 久蕉在线视频| 国产成人综合在线观看| 国产精品精品国产| 放荡的美妇在线播放| 网友自拍一区| 91精品国产综合久久香蕉麻豆| 亚洲中文字幕无码专区| 福利视频在线| 国产喂奶挤奶一区二区三区| 91青青草免费观看| 久草视频在线免费| 精品福利电影| 久色乳综合思思在线视频| 18禁裸乳无遮挡啪啪无码免费| 国产欧美日韩电影| 色综合久久久网| 九九热只有这里有精品| 午夜精品一区| 久久精品水蜜桃av综合天堂| 国产一区二区免费在线观看| 国产裸体永久免费无遮挡| 久久国产精品久久久久久电车| 欧美超级免费视 在线| 亚洲ⅴ国产v天堂a无码二区| 日韩激情毛片| 精品粉嫩超白一线天av| 一级黄色高清视频| av高清一区| 日韩欧美第一页| 国产日韩欧美精品在线观看| 综合久久2019| 综合久久国产九一剧情麻豆| 亚洲成人第一| 福利片在线观看| 久久综合九色综合97_久久久 | 99在线观看免费| 激情偷乱视频一区二区三区| 国产精品爽黄69天堂a| 欧美性猛交xxxx乱大交hd| 国产精品一区毛片| 77777亚洲午夜久久多人| 国产精品白浆一区二小说| 欧美成人一品| 欧美富婆性猛交| 激情四射综合网| 欧美 日韩 国产一区二区在线视频| 中文字幕亚洲一区二区三区| 性猛交娇小69hd| 精品日本12videosex| 亚洲性猛交xxxxwww| 免费网站在线高清观看| 成人在线免费观看视频| 精品国偷自产在线视频99| 亚洲色图27p| 婷婷丁香综合| 欧美成人免费小视频| 日韩一级片av| 在线观看的日韩av| 韩剧1988在线观看免费完整版| 豆国产97在线 | 亚洲| 国产日本精品| 日本中文字幕久久看| 青青艹在线观看| 免费观看美女裸体网站| 天天免费亚洲黑人免费| 欧美色图在线观看| 天堂av手机在线| 久久久久观看| 国产一区二区三区18| 顶级黑人搡bbw搡bbbb搡| 欧美激情在线| 欧美做受高潮电影o| 中文亚洲av片在线观看| 国产二区国产一区在线观看| 国新精品乱码一区二区三区18| 无码国产精品96久久久久| 日本一区二区三区在线观看| 四虎影院一区二区| 阿v视频在线观看| 色成年激情久久综合| av在线免费看片| 国产伦理久久久久久妇女| 亚洲人成在线播放| 国产suv精品一区二区68| 激情久久五月| 国产欧美精品一区二区三区介绍| 亚洲精品一区二区三区四区| 久久久久久久久久久黄色 | 一本色道精品久久一区二区三区| 国产精品激情av电影在线观看| 国产黄a三级三级看三级| 91免费小视频| 成年人深夜视频| 国产麻豆久久| 亚洲国产精品推荐| 小嫩苞一区二区三区| 99热免费精品在线观看| 91免费综合在线| 精品视频二区| 亚洲成人av福利| 一级黄色录像在线观看| 色先锋久久影院av| 欧美xxxx做受欧美| 99成人精品视频| 99精品久久99久久久久| 日韩中文在线字幕| 午夜无码国产理论在线| 亚洲成av人乱码色午夜| 潘金莲一级黄色片| 视频一区二区三区中文字幕| 极品校花啪啪激情久久| 91精品国产91久久久久久青草| 91成人免费电影| 欧美熟妇精品一区二区蜜桃视频| 99视频精品全国免费| 国产99久久久欧美黑人| 日日躁夜夜躁白天躁晚上躁91| 中文字幕日韩欧美一区二区三区| 国产av无码专区亚洲精品| 97视频一区| 九九精品视频在线观看| 一起草av在线| 国产精品色噜噜| 蜜臀久久99精品久久久酒店新书| 第四色在线一区二区| 色综合久久久久久中文网| 一级爱爱免费视频| 国产拍欧美日韩视频二区| 亚欧无线一线二线三线区别| 噜噜噜狠狠夜夜躁精品仙踪林| 欧美激情亚洲一区| www夜片内射视频日韩精品成人| 中文字幕亚洲成人| www.com黄色片| 成人激情免费视频| 国产精品日韩欧美综合| 91在线高清| 欧美日韩激情一区二区| 福利视频第一页| 免费av成人在线| 亚洲永久一区二区三区在线| 色成人综合网| 久久精品国产亚洲| 99久久国产免费| 亚洲在线观看免费视频| www.17c.com喷水少妇| 亚洲三级网站| 美日韩精品免费| 手机看片久久| www亚洲精品| 国产婷婷在线视频| 一区二区三区欧美日| 人妻激情偷乱频一区二区三区| 黄色成人av网站| 久久久com| 日韩一级二级| 久久亚洲国产成人| 亚洲国产精彩视频| 婷婷中文字幕一区三区| 国产精品密蕾丝袜| 极品少妇一区二区三区精品视频| 91麻豆天美传媒在线| 久久99精品久久久久久欧洲站| 国产69精品久久久久99| 深夜福利视频在线观看| 欧美性xxxxxxxx| 亚洲天堂一级片| 丁香婷婷综合网| 超碰97人人射妻| 久久国产电影| 国产精品亚洲不卡a| 亚洲高清黄色| 欧美老女人性生活| 日本一区视频| 欧美日本乱大交xxxxx| 久久久精品视频在线| 久久久久久久综合日本| 波多野结衣在线免费观看| 好吊一区二区三区| 色综合久久av| 成人三级av在线| 国产精品美女999| 欧美日韩经典丝袜| 亚洲视频免费一区| 国产黄a三级三级三级| 色婷婷综合视频在线观看| 午夜精品一区二区三区视频| 91一区二区在线| 91在线第一页| 丝袜美腿亚洲色图| 男人天堂新网址| av一区二区在线播放| 国产精品视频在线免费观看 | 51xtv成人影院| 亚洲少妇中文在线| 精品人妻一区二区三区浪潮在线| 色综合久久六月婷婷中文字幕| 青草草在线视频| 欧美激情一区在线观看| 在线观看国产三级| 黄色资源网久久资源365| 欧美xxxxx在线视频| 国产一区亚洲| 一本色道婷婷久久欧美 | 国产成人亚洲综合色影视| 无码少妇一区二区三区芒果| 亚洲美女视频在线免费观看 | 国产美女免费网站| 成人午夜在线视频| 国产精品嫩草影视| 蜜臀久久99精品久久久久久9| 欧美激情 国产精品| 欧美~级网站不卡| 一区二区不卡视频| 精品国产一区二区三区| 精品网站在线看| 国产精品任我爽爆在线播放| 91天堂在线视频| 欧美啪啪网站| 国产精品久久久久999| 亚洲精品88| 97色伦亚洲国产| jizz一区二区三区| 欧美激情视频网站| 亚洲按摩av| 欧美高清性猛交| 调教一区二区| 欧美高清一级大片| 国内小视频在线看| 欧美激情性做爰免费视频| 97超碰在线公开在线看免费| 精品国产一区二区三区四区在线观看| 国产理论电影在线观看| 亚洲摸下面视频| 日本福利在线观看| 亚洲男人天堂2019| 免费成人av电影| 亚洲丝袜在线视频| 国产98在线| 在线亚洲午夜片av大片| 成人综合影院| 色一区av在线| 米奇777四色精品人人爽| 久久视频在线观看免费| 18av在线视频| 欧美激情一区二区三区高清视频| 黑人精品视频| 日产精品99久久久久久| 国产成人精选| 91中文字幕一区| 一区二区三区亚洲变态调教大结局| 国产成人免费观看| 欧美激情久久久久久久久久久| 精品国产免费一区二区三区| 在线一级成人| 亚洲自拍的二区三区| 欧美日韩蜜桃| 91传媒久久久| 青青草国产精品亚洲专区无| 91小视频在线播放| 高清久久久久久| 9.1成人看片免费版| 国产欧美精品一区aⅴ影院| a一级免费视频| 亚洲一区视频在线观看视频| 天堂中文在线网| 欧美日韩亚洲综合一区二区三区| 国产色视频在线| 亚洲精品99999| 波多野结衣在线影院| 欧美高清视频在线观看| 欧美日韩精品免费观看视完整| 91美女片黄在线观| 国产美女撒尿一区二区| 日韩欧美亚洲精品| 欧美福利在线| 天堂av在线网站| 成人永久免费视频| 精品人伦一区二区三电影| 亚洲欧美激情插| 特级毛片www| 日韩一级大片在线观看| 激情视频在线观看免费| 久久99精品视频一区97| 日本成人伦理电影| 风间由美久久久| 日韩在线观看电影完整版高清免费悬疑悬疑 | 91精品国产高清| 成人在线视频www| 欧美成人免费在线| 午夜日韩电影| 久久撸在线视频| jvid福利写真一区二区三区| 久久久久人妻一区精品色| 欧美日韩国产在线| 精品久久久久久亚洲综合网站| 亚洲人a成www在线影院| 美女尤物在线视频| 国产在线播放91| 国产亚洲一卡2卡3卡4卡新区| 欧美图片激情小说| 精品写真视频在线观看| 亚洲专区区免费| 亚洲福利视频导航| 99热这里只有精品9| 自拍亚洲一区欧美另类| 亚洲校园激情春色| 国产精品区一区二区三含羞草| 国产国产精品| 亚洲天堂2018av| 国产午夜亚洲精品午夜鲁丝片| 日韩激情在线播放| 日韩视频一区二区在线观看| 午夜不卡视频| 国产乱肥老妇国产一区二| 国产不卡一区| 欧美老熟妇喷水| 91亚洲国产成人精品一区二区三 | 欧美另类视频| 国产免费视频传媒| 97精品久久久午夜一区二区三区| 久久免费视频播放| 91精品国产一区二区人妖| 婷婷成人激情| 国产一区二区香蕉| 色喇叭免费久久综合网| 国产一二三四在线视频| 久久精品一区二区| 无码人妻精品一区二区蜜桃色欲| 精品视频久久久久久久| 日本午夜大片a在线观看| 精品无码久久久久国产| 一区二区三区福利| 人妻无码中文久久久久专区| 午夜欧美一区二区三区在线播放| 亚洲精品18p| 欧美疯狂做受xxxx高潮| 8x国产一区二区三区精品推荐| 国产爆乳无码一区二区麻豆| 成人性色生活片免费看爆迷你毛片| 久久久久久激情| 精品国产第一区二区三区观看体验 | 超碰一区二区三区| 老太脱裤子让老头玩xxxxx| 99麻豆久久久国产精品免费优播| 国产污污视频在线观看| 亚洲美女在线看| 久久69成人| 国产大尺度在线观看| 国产精品白丝av| 日本少妇久久久| 亚洲欧美成人网| 啪啪av大全导航福利综合导航| 欧美爱爱视频网站| 国产成人免费在线视频| www.国产成人| 亚洲系列中文字幕| 日本久久二区| 激情五月婷婷六月| 久久综合九色综合久久久精品综合| 最近中文字幕在线观看| 久热在线中文字幕色999舞| 开心激情综合| 男女无套免费视频网站动漫| 成人欧美一区二区三区黑人麻豆| 不卡视频免费在线观看| 1769国产精品| 91嫩草亚洲精品| 超碰caoprom| 欧美色爱综合网| 久久99亚洲网美利坚合众国| 欧美日韩一区在线视频| 狠狠网亚洲精品| 日韩熟女精品一区二区三区| 一区二区在线免费视频| 试看120秒一区二区三区| 亚洲 高清 成人 动漫| 自拍偷拍国产亚洲| 香蕉久久国产av一区二区| 国产一区二区香蕉| 亚洲精品乱码| 欧美风情第一页| 日韩精品中文字幕在线播放| vam成人资源在线观看| 日本在线视频www| 亚洲精品自拍动漫在线| 黄色国产在线| 国产精品swag| 精品制服美女久久| 国产午夜免费福利|