深分頁末日救星:MySQL延遲關聯原理與實戰手冊

MySQL 深分頁(如?LIMIT 100000, 10)本質是?高代價的偏移量掃描,可通過以下方案優化,附核心原理和實操示例:


一、深分頁為什么慢?

SELECT * FROM orders ORDER BY id DESC LIMIT 100000, 10;

執行過程

  1. 通過二級索引或全表掃描定位到第 1 行

  2. 順序掃描 100000 + 10 行

  3. 丟棄前 100000 行,返回最后 10 行
    ??問題:掃描 100010 行但僅返回 10 行,I/O 和 CPU 浪費嚴重


二、優化方案詳解

方案 1:延遲關聯法(最優解)

原理
先查主鍵,再用主鍵回表取數據,減少回表量

SELECT * FROM orders 
INNER JOIN (SELECT id FROM orders ORDER BY create_time DESC LIMIT 100000, 10  -- 只取主鍵
) AS tmp USING(id);

性能對比

原查詢 (直接 LIMIT)延遲關聯法
1.2s0.05s

??適用場景:任何排序字段的深分頁
📌?關鍵點:子查詢必須使用覆蓋索引


方案 2:游標分頁(連續分頁神器)

原理
記錄上一頁最后一條記錄的標識值,作為下一頁起點

-- 第一頁
SELECT * FROM orders 
ORDER BY id DESC 
LIMIT 10;-- 下一頁(假設上一頁最后 id=10200)
SELECT * FROM orders 
WHERE id < 10200  -- 游標定位
ORDER BY id DESC 
LIMIT 10;

性能
???恒定為 10 行掃描,與頁碼無關

???限制

  1. 只能連續頁順序訪問(不可跳頁)

  2. 排序字段必須唯一(否則丟數據)


方案 3:范圍分頁(時間維度優化)

原理
用時間范圍縮小掃描區間

SELECT * FROM orders 
WHERE create_time < '2023-01-01'  -- 上頁的時間邊界
ORDER BY create_time DESC 
LIMIT 10;

性能
🚀 掃描行數 = 目標數據行數 + 索引定位開銷

??適用場景:按時間排序的分頁
📌?優化關鍵:在?create_time?上建索引


方案 4:業務層優化(終極方案)
  1. 禁止跳頁
    只提供“上一頁/下一頁”按鈕(本質是游標分頁)

  2. 數據歸檔
    將歷史數據遷移到歸檔表,減少主表數據量

    -- 遷移3個月前數據
    INSERT INTO orders_archive 
    SELECT * FROM orders WHERE create_time < NOW()-INTERVAL 3 MONTH;DELETE FROM orders WHERE create_time < NOW()-INTERVAL 3 MONTH;

  3. 搜索引擎分流
    將分頁查詢交給 Elasticsearch 等專用引擎


三、索引設計黃金法則

錯誤示例

SELECT * FROM users ORDER BY name LIMIT 800000, 10;
-- 全表掃描 filesort

正確索引方案

  1. 覆蓋索引加速

    ALTER TABLE users ADD INDEX idx_cover(name, id, age);
  2. 延遲關聯寫法

    SELECT * FROM users 
    JOIN (SELECT id FROM users ORDER BY name LIMIT 800000, 10
    ) tmp USING(id)

四、各方案性能對比(百萬數據)

方案掃描行數執行時間適用場景
原生 LIMIT8000101.8s前100頁
延遲關聯800010 + 10行回表0.15s通用
游標分頁100.01s連續分頁
范圍分頁依賴篩選區間0.03s按時間/數值排序
業務層禁止跳頁100.01sC端用戶場景

💡?延遲關聯?是通用性最強的優化方案


五、實戰排查工具

用?EXPLAIN?診斷掃描類型
EXPLAIN SELECT * FROM orders LIMIT 100000, 10;
  • ???危險信號
    type: ALL(全表掃描)
    Extra: Using filesort(內存排序)


總結:優化決策樹

最終建議

  1. 優先用?延遲關聯 + 覆蓋索引

  2. 次選用?游標分頁(體驗犧牲換性能)

  3. 終極方案?Elasticsearch 專庫分頁查詢

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

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

相關文章

前端技術棧 —— HTML、CSS和JavaScirpt執行環境

以下內容由GLM回答生成&#xff0c;不保證正確性。 前端技術棧 —— HTML、CSS和JavaScirpt執行環境 JavaScript 的執行環境HTML 和 CSS 的執行環境HTML 和 CSS 是否可以在其他環境中執行&#xff1f;總結 JavaScript 是一種 解釋型語言&#xff0c;但它也可以被編譯。JavaScr…

多項式帶余除法——線性代數題目為例

一、多項式帶余除法的定義 二、例題 使用方法將在例題中展示&#xff1a;

學習日記-spring-day40-7.3

知識點&#xff1a; 1.自動裝配Resource&#xff08;3&#xff09; 知識點 核心內容 重點 Autowired與Resource注入規則 默認注入邏輯&#xff1a;未指定參數時&#xff0c;Resource優先按屬性名匹配&#xff08;by name&#xff09;&#xff0c;失敗后按類型匹配&#xf…

重新認識JNIEnv

引言 拋開一堆概念&#xff0c;我們從本質出發。 java 調用c 我們開發移動端或者后端服務 &#xff0c;都是用的java 或者kotlin 語言。有時候我們需要用c的一些庫&#xff08;ocr識別/導航的算法/ 等&#xff09; 因為一些跟硬件相關的接口或者系統的api 都是c寫的。 C調用J…

人工智能訓練師——智能語音識別ASR

人機對話——ASR 概念 ASR&#xff08;Automatic Speech Recognition&#xff0c;自動語音識別&#xff09;是一種將人類語音轉換為文本的技術。它使得計算機能夠“聽”懂人類的語音指令或對話&#xff0c;并將其轉換成可讀、可編輯的文本形式。ASR技術是人機交互領域中的一個…

Compose 常用命令詳解——AI教你學Docker

3.3 Compose 常用命令詳解 Docker Compose 通過一系列命令高效管理多容器應用。理解這些命令&#xff0c;可以讓你靈活地啟動、停止、查看、調試、擴縮容和配置 Compose 項目。 一、核心命令詳解 1. docker compose up 功能&#xff1a;啟動并構建所有服務&#xff0c;生成網…

Mausezahn - 網絡流量生成與測試工具(支持從鏈路層到應用層的協議模擬)

Mausezahn 是一個 網絡流量生成與測試工具&#xff0c;主要用于模擬各種網絡協議行為、測試網絡設備性能、驗證安全策略或進行故障排查。它支持從底層鏈路層&#xff08;如 Ethernet、VLAN&#xff09;到高層應用層&#xff08;如 HTTP、DNS&#xff09;的協議模擬&#xff0c;…

08-three.js Textures

Three.js Journey — Learn WebGL with Three.jsThe ultimate Three.js course whether you are a beginner or a more advanced developerhttps://threejs-journey.com/?c=p3 使用原生 JavaScript 首先是靜態頁面的放置位置,如果使用Vite模版配置,可以直接放在 /static/ …

git 倉庫取消合并的分支

要取消 Git 倉庫中某次特定的分支合并(例如第一次合并),同時保留其他分支的合并,需要通過 Git 的版本控制功能來操作。以下是具體的步驟和方法,假設你想撤銷某次合并(例如某個提交),并確保其他合并不受影響: 背景假設 你有一個 Git 倉庫,主分支(例如 main)上已經合…

【從歷史數據分析英特爾該如何擺脫困境】

與大多數其他分析師不同&#xff0c;自2013年以來&#xff0c;筆者就一直在積極強調英特爾未來將遭遇冰山&#xff0c;最終我們預測英特爾將在試圖執行其之前的戰略時破產。盡管我們更愿意采用與英特爾不同的代工廠方法&#xff08;即與臺積電成立合資企業&#xff09;&#xf…

【PyTorch】PyTorch中張量(Tensor)微分操作

PyTorch深度學習總結 第六章 PyTorch中張量(Tensor)微分操作 文章目錄 PyTorch深度學習總結前言一、torch.autograd模塊二、主要功能和使用方法1. 張量的 requires_grad 屬性2. backward() 方法3. torch.no_grad() 上下文管理器三、函數總結前言 上文介紹了PyTorch中張量(Ten…

Rust 項目實戰:Flappy Bird 游戲

Rust 項目實戰&#xff1a;Flappy Bird 游戲 Rust 項目實戰&#xff1a;Flappy Bird 游戲理解 Game loop開發庫&#xff1a;bracket-libbracket-terminalCodepage 437導入 bracket-lib 創建游戲游戲的模式添加玩家添加障礙最終效果項目源碼 Rust 項目實戰&#xff1a;Flappy Bi…

Gin 中間件詳解與實踐

一、中間件的核心概念 定義 中間件是Web開發中非常重要的概念&#xff0c;它可以在請求到達最終處理函數之前或響應返回客戶端之前執行一系列操作。Gin 框架支持自定義和使用內置的中間件&#xff0c;讓你在請求到達路由處理函數前進行一系列預處理操作。 它是介于請求與響應處…

非接觸式DIC測量系統:助力汽車研發與測試的創新技術應用

近年來&#xff0c;隨著新能源汽車品牌的快速崛起&#xff0c;新車發布的節奏加快&#xff0c;層出不窮的新產品&#xff0c;給消費者帶來了全新的使用體驗。與此同時&#xff0c;變革的產品體驗也讓一些過往的汽車測試和評價標準變得不再適用&#xff0c;尤其是與過往燃油車型…

FOC學習筆記(7)鎖相環(PLL)原理及其在電機控制中的應用

1. 鎖相環(PLL)概述 鎖相環&#xff08;Phase-Locked Loop, PLL&#xff09;是一種閉環控制系統&#xff0c;用于使輸出信號的相位與輸入參考信號的相位同步。PLL廣泛應用于通信、電機控制、頻率合成、時鐘恢復等領域。在電機無傳感器控制&#xff08;Sensorless Control&…

鴻蒙自定義相機的拍照頁面

1、權限申請 "requestPermissions": [{"name": "ohos.permission.CAMERA","reason": "$string:reason_camera","usedScene": {"abilities": ["EntryAbility"]}},{"name": "oh…

greenplum7.2并行備份及恢復

1.并行備份 pg_dump -Fd --gp-syntax -U gpadmin -p 5432 -h 172.19.0.2 -d postgres -j 4 -f /opt/greenplum/data/postgres_backup_$(date %Y-%m-%d) 參數 含義 -Fd 使用 directory 格式&#xff08;支持并行&#xff09; --gp-syntax 使用 Greenplum 特定語法&#xff08;…

備賽2025年初中古詩文大會:練習歷年真題,吃透知識點(0703)

初中古詩文大會的比賽內容古詩詞、文言文各占比50%左右&#xff0c;從歷年的比賽來看&#xff0c;中考語文的古詩文部分&#xff08;35分&#xff09;涉及到的古詩詞、文言文知識點都在初中古詩文大會中考過。這些知識點掌握了&#xff0c;對于將來高中、高考也有直接的幫助。 …

BRAKER:真核微生物cds和蛋白注釋

https://github.com/Gaius-Augustus/BRAKER 安裝 # 第一次打開會pull這個docker docker run --user 1000:100 --rm -it teambraker/braker3:latest bash bash /opt/BRAKER/example/docker-tests/test3.sh braker.gtf&#xff1a;BRAKER 的最終基因集。 braker.codingseq&am…

基于 Three.js 與 WebGL 的商場全景 VR 導航系統源碼級解析

本文面向Web前端開發者、WebGL/Three.js 愛好者、對VR/AR應用開發感興趣的技術人員、智慧商場解決方案開發者。詳細介紹如何利用 WebGL (Three.js框架) 構建高性能的商場全景VR環境&#xff0c;并實現精準的室內定位與3D路徑規劃導航功能。 如需獲取商場全景VR導航系統解決方案…