MySQL深分頁慢問題及性能優化

在數據驅動的應用中,分頁是不可或缺的功能。然而,當數據量達到百萬甚至千萬級別時,傳統基于 LIMIT OFFSET 的分頁方式會遭遇嚴重的性能瓶頸,即“深分頁”問題。本文將剖析其根源并提供主流的優化策略。


問題根源:LIMIT OFFSET 為何會慢?

我們最常用的分頁查詢語句如下:

-- 查詢第10001頁,每頁10條數據
SELECT * FROM products ORDER BY id LIMIT 10 OFFSET 100000;

這條SQL的執行邏輯并非直接定位到第100,001條記錄。MySQL的實際處理過程是:

  1. 從存儲引擎中讀取滿足條件的前 100010 (OFFSET + LIMIT) 條記錄。
  2. 在服務層(Server Layer)對這些記錄進行排序。
  3. 拋棄前面的 100000 條記錄。
  4. 返回最終的 10 條記錄。

OFFSET 值越大,MySQL需要掃描、加載并最終拋棄的行數就越多,這導致了巨大的I/O和CPU資源浪費,是性能下降的直接原因。


優化策略

1. 延遲關聯 (Deferred Join)

延遲關聯的核心思想是先通過覆蓋索引快速定位到目標頁的主鍵ID,然后再關聯原表獲取完整的行數據,從而減少對主表數據的掃描。

  • 實現方式

    -- 先通過覆蓋索引快速定位ID,再進行關聯
    SELECT p1.*
    FROM products AS p1
    INNER JOIN (-- 子查詢僅在索引上操作,速度很快SELECT id FROM products ORDER BY id LIMIT 10 OFFSET 100000
    ) AS p2 ON p1.id = p2.id;
    
  • 優點:保留了跳轉任意頁面的功能,性能相較于原始方法有顯著提升。

  • 缺點:SQL語句更復雜;當OFFSET值極大時性能仍會下降。

2. 鍵集分頁 (Keyset Pagination)

鍵集分頁,或稱“書簽”法,是目前性能最優的方案。它摒棄了OFFSET,通過上一頁最后一條記錄的唯一鍵值來定位下一頁的起始位置。

  • 實現方式

    假設我們按自增id排序,上一頁返回的最后一條記錄id100000

    -- 不使用OFFSET,而是利用上一頁的id進行定位
    SELECT * FROM products
    WHERE id > 100000
    ORDER BY id ASC
    LIMIT 10;
    
  • 優點:查詢性能恒定,不受分頁深度影響,速度極快。

  • 缺點:無法直接跳轉到指定頁碼,僅適用于“上一頁/下一頁”或無限滾動場景。需要一個唯一且有序的排序列。

3. 業務限制

從產品層面限制用戶能夠訪問的最大頁數(例如100頁)。在多數場景下,用戶很少會瀏覽非常靠后的頁面,引導用戶使用更精確的篩選條件是更有效的方式。

  • 優點:實現簡單,從根本上規避了技術難題。
  • 缺點:犧牲了部分功能,不適用于必須允許訪問所有數據的場景。

總結

策略優點缺點適用場景
延遲關聯功能完整,性能提升顯著SQL復雜,深度分頁仍有瓶頸需要跳轉頁碼的傳統分頁
鍵集分頁性能最佳且穩定無法跳頁無限滾動、上一頁/下一頁
業務限制實現簡單,規避問題功能受限搜索結果等多數常規列表

結論:在設計分頁功能時,應優先考慮鍵集分頁方案以獲得最佳性能。如果必須支持跳轉任意頁碼,延遲關聯是一個有效的折中選擇。根據實際業務需求選擇最合適的策略,是解決深分頁問題的關鍵。

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

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

相關文章

漫談《數字圖像處理》之平滑

在數字圖像處理中,平滑(Smoothing) 的核心目標是降低圖像噪聲、模糊細節或簡化紋理,本質是通過 “局部鄰域運算” 對像素值進行 “平均化” 或 “規整化”,讓圖像整體更 “平緩”。形態學平滑與高斯平滑、均值平滑等其…

機器學習之數據預處理學習總結

在機器學習中,數據預處理是模型訓練前至關重要的環節,直接影響模型的性能和準確性。通過本次學習,我系統掌握了數據預處理的核心方法與工具,現將主要內容總結如下:一、缺失值處理缺失值是實際數據中常見的問題&#xf…

在完全沒有無線網絡(Wi-Fi)和移動網絡(蜂窩數據)的環境下,使用安卓平板,通過USB數據線(而不是Wi-Fi)來控制電腦(版本2)

在完全沒有無線網絡(Wi-Fi)和移動網絡(蜂窩數據)的環境下,要實現用安卓手機通過USB數據線控制電腦,核心思路是:利用USB數據線創建一個純粹的、本地的有線網絡連接。 這不僅是可行的,…

Ubuntu22.04配置網絡上網

前言 安裝Ubuntu系統后,有時會遇到無法聯網、無法使用瀏覽器的問題。然而當宿主機已連接網絡時,虛擬機通常也能聯網,需要進行一些配置,現在就以Ubuntu22.04為例。 VMware配置打開虛擬網絡編輯器 啟動VMWare點擊編輯,并…

網絡協議之TCP和UDP

寫在前面 本文來看下TCP和UDP協議。 我們接觸這兩個協議最多的應該就是在面試中了,經典題目就是“TCP和UDP有什么區別?”,而最常得到的答案就是TCP是面向連接的,而UDP是面向無連接的。 那么這里的連接到底是什么呢?難…

Qt音樂播放器項目實踐:本地持久化與邊角問題處理

本音樂播放器完整項目源碼(包含各個按鈕的圖片文件): ly/Project-Code - Gitee.com 一.本地持久化 請注意,學習此部分之前需要讀者具有一定的Mysql基礎。如果讀者能夠接受無法本地持久化,那么可以跳過這部分內容,直接去看邊角問題處理。我…

基于NB-IoT技術的寵物定位跟蹤系統設計#基于STM32\物聯網\單片機技術的寵物定位跟蹤系統

基于NB-IoT技術的寵物定位跟蹤系統設計#基于STM32\物聯網\單片機技術的寵物定位跟蹤系統在設計基于NB-IoT技術的寵物定位跟蹤系統時,首先明確了系統分為感知層、網絡層和應用層三個部分。在感知層,考慮到需要獲取寵物位置和運動狀態,選用GPS定…

【入門級-算法-3、基礎算法:遞歸法】

遞歸是一種非常重要的算法思想,它指的是函數調用自身的過程。遞歸通常包含兩個主要部分:基線條件(終止條件)和遞歸條件(調用自身的條件)。 下面通過例子來理解遞歸算法: 計算階乘 階乘的遞歸定義…

【CS創世SD NAND征文】存儲芯片在工業電表中的應用與技術演進

【CS創世SD NAND征文】存儲芯片在工業電表中的應用與技術演進1.工業電表的市場背景2.技術方案分析3.核心技術特性3.1.主控芯片:APM32F465VET63.3.存儲芯片:CSNP4GCR01-DPW3.3.1. 基本概述3.3.2. 核心特性3.3.3. 優勢特點3.3.4 四大管理算法4.存儲芯片性能…

建筑施工遮擋場景漏檢率↓76%:陌訊動態融合算法實戰解析

原創聲明 本文為原創內容,技術參數及架構解析引用自《陌訊技術白皮書》,未經授權禁止轉載。 一、行業痛點:建筑施工安全監控的 "看得見" 與 "看不準" 建筑施工場景的安全監控長期面臨雙重挑戰:一方面&…

【LeetCode題解】LeetCode 209. 長度最小的子數組

【題目鏈接】 209. 長度最小的子數組 【題目描述】 【題解】 方法一:滑動窗口 本題可以使用雙指針算法,定義兩個指針l和r分別表示子數組的開始位置和起始位置,sum數組存儲的從l到r區間內所有元素的和。初始狀態下,l和r都指向下…

2025-08-21 Python進階6——迭代器生成器與with

文章目錄1 迭代器與生成器1.1 迭代器1.1.1 基本使用1.1.2 手動迭代(帶異常處理)1.1.3 自定義迭代器1.2 生成器1.2.1 工作原理1.2.2 斐波那契數列示例1.3 推導式1.3.1 列表推導式1.3.2 字典推導式1.3.3 集合推導式1.4.4 元組推導式(生成器表達…

C++——C++重點知識點復習2(詳細復習模板,繼承)

目錄 模板 函數模板 類模板 非類型模板參數 模板的特化 函數模板特化 類模板的特化 為什么普通函數可以分離? 繼承 繼承概念 基類和派生類對象賦值轉換(切割,切片) 隱藏 派生類的默認成員函數 .復雜的菱形繼承及菱形…

python 項目編號 2025821 有關于中英文數據的收集、處理

python專欄記錄:前言 批量讀取單詞 JSON 文件 → 解析出單詞、釋義、例句、短語 → 數據清洗(去掉特殊符號) → 同步更新到 MySQL 數據庫。 內容 import json import pymysql import re import time from pymysql.converters import escape_s…

Document Solutions .NET Bundle 8.2.0

Document Solutions .NET Bundle 8.2.0MESCIUS 的 Document Solutions .NET Bundle 是一套完整的 API 和查看工具,可增強文檔處理并提高效率。它包含 Excel、Word、PDF 和圖像文檔,以及 PDF 查看器、數據查看器和圖像查看器的標準許可證。它將強大的 .NE…

在職老D滲透日記day20:sqli-labs靶場通關(第27關)get報錯注入 過濾select和union ‘閉合

5.27.第27關 get報錯注入 過濾select和union 閉合function blacklist($id) { $id preg_replace(/[\/\*]/,"", $id); //strip out /* $id preg_replace(/[--]/,"", $id); //Strip out --. $id preg_replace(/[#]/,"", $id); //Strip out #. $…

Go 并發編程-channel

channel 文章目錄channel簡介基本概念類型表示法值表示法操作的特性初始化通道接收元素值Happens before發送值例1核心組件關鍵執行順序輸出示例(可能順序)設計要點例2例3關閉通道長度與容量單向通道主要用途增強代碼表達性和安全性(最重要的…

開源和免費一樣嗎?以商城系統為例為您分析~

開源和免費并不完全一樣,二者在核心定義、權利范圍和實際應用中存在顯著區別,具體可以從以下幾個方面理解: 1. 核心定義不同開源(Open Source): 指軟件的源代碼是公開可獲取的,任何人都可以查看…

CMOS知識點 MOS管飽和區電流公式

知識點16&#xff1a;同上篇一樣&#xff0c;MOS管主要有3個工作區域&#xff1a;截止區&#xff08;Cut-off Region&#xff09;&#xff1a; < &#xff0c;沒有溝道形成&#xff0c;幾乎沒有電流。線性區/三極管區&#xff08;Triode Region&#xff09;&#xff1a; &g…

【集合框架LinkedList底層添加元素機制】

在 Java 集合框架中&#xff0c;LinkedList 與 ArrayList 是兩種截然不同的線性表實現。如果說 ArrayList 像一個可以伸縮的“盒子陣列”&#xff0c;那么 LinkedList 就像一條由“節點”串聯而成的“雙向鏈條”。今天&#xff0c;我們將深入 LinkedList 的源碼&#xff0c;一步…