Mysql的深度分頁查詢優化

一、深度分頁為什么慢?

當執行?SELECT * FROM orders ORDER BY id LIMIT 1000000, 10?時:

  • MySQL 會掃描前 1,000,010 行,丟棄前 100 萬行,僅返回 10 行。
  • 偏移量(offset)越大,掃描行數越多,時間復雜度為?O(N+M)(N = 偏移量,M = 每頁條數)。

核心痛點LIMIT?本質是 “跳過” 數據,而非 “直接定位”,導致全表掃描。

二、5 大優化方案(按優先級排序)

🔍 方案 1:覆蓋索引 + 延遲關聯(通用最優解)

原理:先通過索引定位主鍵,再批量回表,減少無效掃描。
實現

sql

-- 1. 創建覆蓋索引(包含排序字段+主鍵)
ALTER TABLE orders ADD INDEX idx_created_at_id (created_at, id);-- 2. 優化查詢(子查詢只查索引,主查詢回表)
SELECT o.* 
FROM orders o
INNER JOIN (SELECT id  -- 僅需主鍵(覆蓋索引)FROM orders ORDER BY created_at, id  -- 利用索引排序LIMIT 1000000, 10  -- 僅掃描 10 行索引
) AS tmp ON o.id = tmp.id;

效果:掃描行數從?1,000,010?降至?10,速度提升 10 萬倍!
適用場景:所有帶排序的分頁(如訂單、日志)。

📌 方案 2:游標分頁(適合連續翻頁)

原理:記錄上一頁最后一條的?id,避免?OFFSET
示例

sql

-- 第 1 頁(初始查詢)
SELECT * FROM orders ORDER BY id DESC LIMIT 10;  -- 假設最后一條 id=1000-- 第 2 頁(基于游標)
SELECT * 
FROM orders 
WHERE id < 1000  -- 定位起始點
ORDER BY id DESC 
LIMIT 10;  -- 僅掃描 10 行

優點:時間復雜度?O(M),與頁碼無關;適合無限滾動(如抖音刷視頻)。
缺點:不支持隨機跳頁(如直接跳轉到第 1000 頁)。

🗂? 方案 3:范圍分片(依賴有序數據)

原理:按時間 / ID 分段,縮小查詢范圍。
示例

sql

-- 按月份分區查詢(假設數據按月遞增)
SELECT * 
FROM orders 
WHERE created_at BETWEEN '2023-10-01' AND '2023-10-31'
ORDER BY id 
LIMIT 10;

適用場景:時間序列數據(如報表、日志),用戶可接受 “按范圍篩選”。

💡 方案 4:預計算分頁(冷數據專用)

原理:提前計算分頁書簽,存入匯總表。
實現

sql

-- 創建匯總表(每日凌晨更新)
CREATE TABLE order_pager (page_num INT PRIMARY KEY,min_id BIGINT,max_id BIGINT
);-- 插入分頁書簽(每頁 100 條)
INSERT INTO order_pager
SELECT FLOOR((id-1)/100) + 1 AS page_num,MIN(id) AS min_id,MAX(id) AS max_id
FROM orders
GROUP BY page_num;-- 查詢第 1000 頁
SELECT * 
FROM orders 
WHERE id BETWEEN (SELECT min_id FROM order_pager WHERE page_num=1000) AND (SELECT max_id FROM order_pager WHERE page_num=1000)
LIMIT 100;

優點:查詢時間穩定,適合歷史數據(如年報);缺點:存儲冗余。

🚀 方案 5:Elasticsearch 兜底(海量數據)

原理:利用 ES 的?search_after?避免深度分頁性能衰減。
示例

json

GET /orders/_search
{"size": 10,"sort": ["_id"],  -- 按主鍵排序"search_after": [1000000],  -- 上一頁最后一條的 _id"query": { ... }
}

適用場景:百萬級以上數據,需復雜查詢(如全文搜索)。

三、索引設計黃金法則

場景索引建議示例
時間 + 主鍵排序復合索引(時間,主鍵)(created_at, id)
多條件過濾 + 排序最左匹配索引(WHERE > ORDER BY)(status, created_at, id)
字符串排序前綴索引(平衡長度與選擇性)name(20)?(取前 20 字符)

?? 注意:索引非越多越好,單表索引不超過 5 個,避免冗余。

四、方案對比與選擇指南

方案時間復雜度適用場景推薦指數
覆蓋索引 + 延遲關聯O(M)通用場景(90% 業務首選)?????
游標分頁O(M)連續翻頁(如 App 列表)????
預計算分頁O(1)冷數據歷史查詢???
ElasticsearchO(logN)海量數據 + 復雜查詢????

決策樹

  1. 數據量 < 10 萬:直接?LIMIT,無需優化。
  2. 10 萬~100 萬:方案 1(覆蓋索引)。
  3. 100 萬~1000 萬:方案 1 + 方案 2(游標)。
  4. 千萬級以上:方案 5(ES)+ 方案 1 兜底。

五、實戰避坑指南

  1. ** 避免 SELECT ***:只查必要字段,減少回表數據量。
  2. 監控執行計劃

    sql

    EXPLAIN SELECT * FROM orders ...;  -- 重點看 `rows` 列,理想值接近 LIMIT 數量。
    
  3. 慢查詢日志:捕獲真實慢查詢(如?LIMIT 500000,10?超過 1 秒)。
  4. 業務妥協:限制最大分頁深度(如 App 最多顯示 500 頁),避免極端場景。

總結

深度分頁的核心優化思路是?“跳過掃描,直接定位”

  • 熱數據:用覆蓋索引 + 延遲關聯,確保每次查詢只掃描少量索引。
  • 冷數據:預計算分頁或歸檔到 ES,犧牲空間換時間。
  • 業務層:結合游標分頁和分頁深度限制,避免數據庫被拖垮。

通過這一套組合拳,可將深度分頁的耗時從 “秒級” 優化到 “毫秒級”,輕松應對百萬級數據分頁!

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

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

相關文章

最新扣子(Coze)案例教程:Excel數據生成統計圖表,自動清洗數據+轉換可視化圖表+零代碼,完全免費教程

大家好&#xff0c;我是斜杠君。 知識星球群有同學和我說每天的工作涉及很多數據表的重復操作&#xff0c;想學習Excel數據表通過大模型自動轉數據圖片的功能。 今天斜杠君就帶大家一起搭建一個智能體&#xff0c;以一個銷售行業數據為例&#xff0c;可以快速實現自動清洗Exc…

Uniapp 中緩存操作指南

在 Uniapp 中,你可以使用三種方式操作緩存:同步方法、異步方法和 Vuex 持久化存儲。以下是詳細的設置、獲取和清除緩存的方法: 1. 同步方法 設置緩存 uni.setStorageSync(key, value); // 示例 uni.setStorageSync(token, abc123); 獲取緩存 const value = uni.getStor…

k8s的yaml文件里的volume跟volumeMount的區別

volume 是 Pod 級別的資源&#xff0c;用于定義存儲卷。它是一個獨立于容器的存儲資源&#xff0c;可以被一個或多個容器共享使用。volume 的定義位于 Pod 的 spec.volumes 部分。 特點 獨立性&#xff1a;volume 是 Pod 的一部分&#xff0c;而不是容器的一部分。它獨立于容…

梅毒單陽能否通過國企體檢?

國企體檢通常會參照公務員體檢標準進行&#xff0c;梅毒檢測是其中的常規項目。 一、明確“梅毒單陽”的定義 檢測指標解析 TPPA陽性RPR陰性&#xff1a;可能為既往感染已治愈&#xff0c;或極早期/晚期梅毒&#xff1b; RPR陽性TPPA陰性&#xff1a;需警惕假陽性&#xff08…

Python 爬蟲實戰 | 企名科技

文章目錄 一、企名科技1、目標網站2、網站特點3、確定解密位置4、扣js代碼 一、企名科技 1、目標網站 網址&#xff1a;https://wx.qmpsee.com/articleDetail?idfeef62bfdac45a94b9cd89aed5c235be目標數據&#xff1a;獲取消費行業研究下面的13篇文章數據 2、網站特點 服…

Pikachu靶場

本質是信任了不可信的客戶端輸入。防御核心&#xff1a; 永不信任客戶端提交的權限參數&#xff08;如 user_id, role&#xff09;。強制服務端校驗用戶身份與操作權限。定期審計權限模型&#xff0c;避免業務迭代引入新漏洞。 水平越權 1&#xff0c;按照網站的提示要求登錄 進…

C++區別于C語言的提升用法(萬字總結)

1.namespace產生原因 在C語言中&#xff0c;變量&#xff0c;函數&#xff0c;以至于類都是大量存在的&#xff0c;因此會產生大量的名稱存在于全局作用域中&#xff0c;可能產生很多沖突&#xff0c;至此c的祖師爺為避免命名沖突和名字的污染&#xff0c;造出來了關鍵字names…

數據庫day-07

一、實驗名稱和性質 子查詢 驗證 設計 二、實驗目的 1&#xff0e;掌握子查詢的嵌套查詢&#xff1b; 2.掌握集合操作 3&#xff0e;了解EXISTS嵌套查詢方法&#xff1b; 三、實驗的軟硬件環境要求 硬件環境要求&#xff1a; PC機(單機) 使用的軟件名稱、版本號以及模塊…

【前端】【業務場景】【面試】在前端開發中,如何實現文件的上傳與下載功能,并且處理可能出現的錯誤情況?

前端文件上傳與下載攻略 本文目標&#xff1a;幫你快速掌握文件上傳 & 下載的核心實現方式&#xff0c;并在常見出錯場景下保持“優雅不崩潰”。 一、文件上傳 1. 基礎結構 <input type"file" id"fileInput" /> <button id"uploadBtn&…

Kafka 消息積壓監控和報警配置的詳細步驟

Kafka 消息積壓監控和報警配置的詳細步驟示例&#xff0c;涵蓋常用工具&#xff08;如 Prometheus Grafana、云服務監控&#xff09;和自定義腳本方法&#xff1a; 一、監控配置 方法1&#xff1a;使用 Prometheus Grafana kafka-exporter 步驟1&#xff1a;部署 kafka-ex…

【C++】內存管理:內存劃分、動態內存管理(new、delete用法)

文章目錄 一、C/C中的內存劃分二、C語言中動態內存管理方式三、C中動態內存管理方式1、new、delete基本用法(1)、內置類型(2)、自定義類型 2、operator new與operator delete函數3、new和delete的實現原理&#xff08;1&#xff09;內置類型&#xff08;2&#xff09;自定義類型…

C# 實戰_RichTextBox選中某一行條目高亮,離開恢復

C# 中控件richtextbox中某一行的條目內容高亮&#xff0c;未選中保持不變。當鼠標點擊某一行的條目高亮&#xff0c;離開該條目就恢復默認顏色。 運行效果&#xff1a; 核心代碼實現功能&#xff1a; //高亮指定行的方法private void HighlightLine(RichTextBox rtb,int lineI…

Vue3 ref與props

ref 屬性 與 props 一、核心概念對比 特性ref (標簽屬性)props作用對象DOM 元素/組件實例組件間數據傳遞數據流向父組件訪問子組件/DOM父組件 → 子組件響應性直接操作對象單向數據流&#xff08;只讀&#xff09;使用場景獲取 DOM/調用子組件方法組件參數傳遞Vue3 變化不再自…

視頻匯聚平臺EasyCVR賦能高清網絡攝像機:打造高性價比視頻監控系統

在現代視頻監控系統中&#xff0c;高清網絡攝像機作為核心設備&#xff0c;其性能和配置直接影響監控效果和整體系統的價值。本文將結合EasyCVR視頻監控的功能&#xff0c;探討如何在滿足使用需求的同時&#xff0c;優化監控系統的設計&#xff0c;降低項目成本&#xff0c;并提…

【C++】 —— 筆試刷題day_21

一、愛麗絲的人偶 題目解析 現在存在n個玩偶&#xff0c;每個玩偶的身高是1、2、3......n&#xff1b; 現在我們要對這些玩偶進行排序&#xff08;如果x人偶&#xff0c;它左右兩邊的玩偶一個比x高、一個比x矮&#xff0c;那這個玩偶就會爆炸&#xff09;。 我們不想要任何一個…

詳解.vscode 下的json .vscode文件夾下各個文件的作用

1.背景 看一些開源項目的時候,總是看到vscode先有不同的json文件,再次做一下總結方便之后查看 settings.json肯定不用多說了 vscode 編輯器分為 全局用戶配置 和 當前工作區配置 那么.vscode文件夾下的settings.json文件夾肯定就是當前工作區配置了 在此文件對單個的項目進行配…

手動實現legend 與 echarts圖交互 通過js事件實現圖標某項的高亮 顯示與隱藏

通過html實現legend的樣式 提供調用echarts的api實現與echarts圖表交互的效果 實現餅圖element實現類似于legend與echartstu表交互效果 效果圖 配置代碼 <template><div style"height: 400px; width: 500px;background-color: #CCC;"><v-chart:opti…

Spring Boot 配置源詳解(完整版)

Spring Boot 配置源詳解&#xff08;完整版&#xff09; 一、配置源加載順序與優先級 配置源類型優先級順序&#xff08;從高到低&#xff09;對應配置類/接口是否可覆蓋典型文件/來源命令行參數&#xff08;--keyvalue&#xff09;1&#xff08;最高&#xff09;SimpleComman…

【無人機】無人機遙控器設置與校準,飛行模式的選擇,無線電控制 (RC) 設置

目錄 1、遙控器校準 1.1、校準步驟 2、飛行模式選擇&#xff0c;遙控器通道映射 2.1、配置步驟 1、遙控器校準 在校準無線電系統之前&#xff0c;必須連接/綁定接收器和發射器。綁定發射器和接收器對的過程是特定于硬件的&#xff08;有關說明&#xff0c;請參閱 RC 手冊&…

Redis 有序集合 ZSet 深度解析教程

Redis-ZSet 引言一、 ZSet 核心概念與特性1.1 什么是 ZSet&#xff1f;1.2 ZSet 與 Set、List 的本質區別 二、 ZSet 典型應用場景2.1 排行榜 (Leaderboards)2.2 帶權重的任務隊列 / 延遲隊列2.3 時間軸 (Timeline)2.4 范圍查找 三、 ZSet 底層實現3.1 ziplist (壓縮列表)3.2 s…