Mysql分頁:高效處理海量數據的核心技術

Mysql分頁:高效處理海量數據的核心技術

在這里插入圖片描述

01 引言

在Web應用、移動應用或數據分析場景中,數據庫常常需要處理百萬甚至千萬級的數據記錄。一次性加載所有數據不僅效率低下,還會消耗大量網絡帶寬和內存資源。數據庫分頁技術正是解決這一挑戰的關鍵方案。

在日常開發中,對于列表頁面的查詢、全鏈路操作日志等,數據的結果集可以無限增大或者數據量本身很大的場景,我們常常會增加分頁,以避免一次性全量加載帶來的內存、IO的壓力。

02 分頁方式

為了測試需要,按照ID順序插入了100萬的數據。

下面是分頁插件展示的效果:
在這里插入圖片描述

2.1 LIMIT-OFFSET

腳本

-- 獲取第3頁(每頁10條)
select * from user_info order by id asc LIMIT 10 OFFSET 20;

LIMIT后面跟的事查詢的數據數量,而OFFSET后面跟的是數據偏移量,也就是要跳過的數據量。

結果
在這里插入圖片描述

頁數計算:

  • 第一頁:1~10
  • 第二頁:11~20
  • 第三頁:21~30

這種分頁的方式,小編之前是不知道的,在查線上問題的時候偶然看到一段代碼塊,就好奇的點進去看了看:

在這里插入圖片描述

才發現原來這樣也可以分頁,真的是漲知識了。

2.2 LIMIT X,Y

limit x,y 是小編常用的分頁方式,x指偏移量,同offset。而y則指需要查詢的數量。

腳本

-- 獲取第3頁(每頁10條)
select * from user_info order by id asc LIMIT 20, 10;

結果

在這里插入圖片描述

這種方式可能是習慣了,用起來感覺更加順手。

03 分頁使用注意事項

查詢的結果的分頁用起來比較簡單,但是使用不當的話就會出現與期望偏差的數據。

3.1 語法

語法很簡單,需要LIMIT關鍵字。

  • LIMIT ${偏移量},${要顯示的記錄數}
  • LIMIT ${要顯示的記錄數} OFFEST ${偏移量}

兩者任選其一。

3.2 執行順序

分頁一定是最后需要執行或者處理的,無論簡單的腳本還是復雜的腳本都是在語句的結尾。

腳本

-- 聚合查詢
select age, count(*) from user_info GROUP BY age HAVING age > 30 ORDER BY age LIMIT 20, 10;

結果

在這里插入圖片描述

頁數計算:

  • 第一頁:31~40
  • 第二頁:41~50
  • 第三頁:51~60

3.3 單條數據的查詢

在業務代碼中,我們如何查詢一條數據呢?Mapper的查詢結果中,返回的結果是一個數據集,要查詢一條數據我們一般都是取集合中的第一條。

例如:我們需要再數據庫中找到一個18歲的女孩。

腳本

select * from user_info WHERE age=18 AND sex='女';

結果

在這里插入圖片描述

偽代碼

List<UserInfo> userList = userInfoService.selectByAgeAndSex(18, "女");
return CollectionUtils.isNotEmpty(userList) ? userList.get(0) : null;

乍一看代碼似乎沒有什么問題,結果是確實返回了一條。但是Mysql結果集有很多數據,需要加載到內存中甚至在微服務之間傳輸,這樣的無疑增加了資源的消耗。

我們可以直接從數據庫中只查一條數據就好了,沒有必要都查出來。我們需要使用LIMIT的另一語法:

  • LIMIT 要返回的數據量LIMIT 1 :返回一條數據】
select * from user_info WHERE age=18 AND sex='女' LIMIT 1;

在這里插入圖片描述

3.4 深分頁問題

深分頁是一個無聊的話題,但是確實面試的一個考察點。

select * from user_info LIMIT 800000,10;

這已經翻了8w頁了,還要繼續翻么?這就是所謂的深分頁。誰會這么干!

當然了,這樣的查詢語句的效率是低下的,測試的數據比較簡單耗時大概1084ms。如何去優化呢?

主要原因是沒有使用到覆蓋索引,此時為了得到完整記錄就需要回表,而回表是隨機磁盤IO,速度慢消耗大。

解決辦法就是減少回表次數:

-- 根據ID自增特性
select * from user_info WHERE id > 800000 limit 10;-- 自關聯,減少回表次數
select * from user_info u INNER JOIN (select id from user_info LIMIT 800000,10) uu ON uu.id=u.id;

從一定程度上可以提高響應速度,測試結果分別可以的達到758ms915ms

04 分頁公式

4.1 總頁數計算

分頁需要我們來計算。首先我們需要知道總共有多少數據(count),每頁多少數據(length),這樣我們才能知道能分多少頁(total)。

// 總頁數total的計算公式
int total = (int) Math.floor((this.count * 1.0d) / this.length);
if (this.count % this.length != 0) {// 除不盡,需要頁數+1this.total++;
}

注意:這里是Math.floor()向下取整,然后總記錄數除不盡每頁的數量,頁數就是+1。

4.2 偏移量計算

偏移量的計算需要知道當前是多少頁(current)了。

// 計算偏移量
int offset = (this.current - 1) * this.length;

4.3 分頁的使用

  • 通過上面的公式自定義分頁
  • 使用第三方的分頁,如cn.hutool.db.PageResult

05 小結

我們習慣了三方庫的分頁,可能從來都沒有自己去實現過分頁或者封裝都屬于自己框架的分頁,趕快去試試吧。

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

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

相關文章

通過 Docker 運行 Prometheus 入門

Promethues 組件 prometheus serverexporteralertmanager 環境準備 Docker 拉取鏡像備用 # https://hub.docker.com/r/prom/prometheus docker pull m.daocloud.io/docker.io/prom/prometheus:main# https://hub.docker.com/r/prom/node-exporter docker pull m.daocloud.io/do…

Java 8特性(一)

目錄 一、Lambda表達式 1、語法格式&#xff1a; &#xff08;1&#xff09;接口名 對象名(參數類型1參數名1,....參數類型n 參數名n)->{方法體;} &#xff08;2&#xff09;參數類型h 參數名n:接口中抽象方法的參數項 &#xff08;3&#xff09;->:表示連接操作 &a…

【代碼隨想錄|232.用棧實現隊列、225.用隊列實現棧、20.有效的括號、1047.刪除字符串中的所有相鄰重復項】

232.用棧實現隊列 timutimtit232. 用棧實現隊列 - 力扣&#xff08;LeetCode&#xff09; class MyQueue { public:stack<int> Sin;stack<int> Sout;MyQueue() {}void push(int x) {Sin.push(x);}int pop() {if (Sout.empty()) { // 出棧為空就把入棧的數導出來w…

碼上爬第三題【協程+瀏覽器調試檢測】

前言&#xff1a;圖靈第三題就是對用戶瀏覽器調試檢測&#xff0c;檢測鼠標右擊打開控制臺&#xff0c;檢測鍵盤按鍵ctrlshifti&#xff0c;從瀏覽器設置打開開發者工具也不行&#xff0c;應該是有瀏覽器寬高檢測的&#xff0c;所以我們保證瀏覽器頁面寬高不變即可。你如果想右…

windows、linux應急響應入侵排查

windows入侵排查 1.1檢查賬號 1.查看服務器是否有弱口令&#xff0c;遠程管理端口是否對公網開放 2.查看服務器是否存在可疑賬號、新增賬號 檢查方法&#xff1a;打開 cmd 窗口&#xff0c;輸入 lusrmgr.msc 命令&#xff0c;查看是否有新增/可疑的賬號&#xff0c;如有管…

11. 為什么要用static關鍵字

11. 為什么要用static關鍵字 static&#xff1a;通常來說&#xff1a;在new一個對象的時候&#xff0c;數據存儲空間才會被分配&#xff0c;方法才能被外界使用。但是有時只想單獨分配一個存儲空間&#xff0c;不考慮需要創建對象或不創建對象&#xff0c;在沒有對象的情況下也…

[Oracle] MAX()和MIN()函數

MAX() 和 MIN() 是 Oracle 常用的聚合函數&#xff0c;用于從一組值中找出最大值和最小值1.MAX()函數MAX()函數返回指定列或表達式中的最大值語法格式MAX(expression)參數說明expression&#xff1a;可以是列名、計算列或表達式示例-- 返回employees表中salary列的最大值 SELEC…

網絡資源模板--基于Android Studio 實現的麻雀筆記App

目錄 一、測試環境說明 二、項目簡介 三、項目演示 四、部設計詳情&#xff08;部分) 添加頁面 五、項目源碼 一、測試環境說明 電腦環境 Windows 11 編寫語言 JAVA 開發軟件 Android Studio (2020) 開發軟件只要大于等于測試版本即可(近幾年官網直接下載也可以)&…

96-基于Flask的酷狗音樂數據可視化分析系統

基于Flask的酷狗音樂數據可視化分析系統 &#x1f4cb; 目錄 項目概述技術棧系統架構功能特性數據庫設計核心代碼實現數據可視化部署指南項目總結 &#x1f3af; 項目概述 本項目是一個基于Flask框架開發的酷狗音樂數據可視化分析系統&#xff0c;旨在為用戶提供音樂數據的…

Java基礎-紅包雨游戲-多線程

目錄 案例要求&#xff1a; 實現思路&#xff1a; 代碼&#xff1a; Employee RedPacket RedPacketRain 總結&#xff1a; 案例要求&#xff1a; 實現思路&#xff1a; 創建一個員工類,id和搶到的金額&#xff0c;創建一個紅包類&#xff0c;里面就是金額&#xff0c;創…

[激光原理與應用-203]:光學器件 - 增益晶體 - 增益晶體的使用方法

增益晶體是激光器的核心元件&#xff0c;其作用是通過受激輻射放大光信號。正確使用增益晶體需綜合考慮晶體選型、光路設計、熱管理、泵浦方式及安全防護等關鍵環節。以下是增益晶體的詳細使用方法及注意事項&#xff1a;一、晶體選型&#xff1a;根據需求匹配參數材料選擇Nd:Y…

?什么是抽象主義人工智能??

什么是抽象主義人工智能&#xff1f; 傳統的人工智能分為符號主義和連接主義兩個派別&#xff0c;后來又增加了行為主義。 我發現符號主義和連接主義處理的都是文本&#xff0c;而不是語義。原來的專家系統是符號主義的產物。現在的大語言模型是連接主義的產物。它們處理的都…

OpenSpeedy綠色免費版下載,提升下載速度,網盤下載速度等游戲變速工具

下載地址獲取點擊這里打開&#xff1a;OpenSpeedy 簡單介紹OpenSpeedy 是一款開源免費的游戲變速工具&#xff08;對某些網盤或者其他的一些下載也可進行加速&#xff09;&#xff0c;讓你的游戲突破幀率限制&#xff0c;提供更流暢絲滑的游戲加速體驗。1、完全免費且開源2、簡…

Windows 電腦遠程訪問,ZeroTier 實現內網穿透完整指南(含原理講解)

&#x1f9ed; 一、目標場景說明 想從安卓移動端遠程到Windows電腦 實現如下效果&#xff1a; 家中 Windows 電腦開機聯網&#xff1b;安卓手機/平板在外地&#xff0c;只要聯網就能遠程控制電腦桌面&#xff1b;不需要公網 IP&#xff0c;不用設置端口映射&#xff1b;免費…

解決本地連接服務器ollama的錯誤

1. 服務器 ollama 安裝 $ curl -fsSL https://ollama.com/install.sh | sh >>> Cleaning up old version at /usr/local/lib/ollama >>> Installing ollama to /usr/local >>> Downloading Linux amd64 bundle ##################################…

詳解Windows(十四)——PowerShell與命令提示符

詳解Windows&#xff08;十四&#xff09;——PowerShell與命令提示符 一、Windows命令行工具概述 1. 什么是命令行界面(CLI) 命令行界面&#xff0c;簡稱CLI&#xff08;Command Line Interface&#xff09;&#xff0c;是一種通過輸入文字命令來操作電腦的方式。與我們熟悉…

Spring源碼解析 - SpringApplication 屬性-初始化initializers, listeners -Spring提供的鉤子函數

初始化源碼 public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {~~~setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));setListeners((Collection) getSpringFactoriesInstances(A…

簡單聊聊PowerShell

1、powershell和cmdpowershell簡單來說也是一個控制終端&#xff0c;他也經常拿出來和windows自帶的CMD來進行對比。windows系統一般來說這兩者都是自帶的。雖然cmd平時大家用的最多&#xff0c;但他是非常古老的&#xff0c;可以用來執行簡單的批處理文件&#xff0c;如.bat等…

Spring系列之Spring AI入門

概述 GitHub&#xff0c;官網&#xff0c;目前最新版是1.0.1。 功能&#xff1a; 跨AI提供商的可移植API&#xff1a;用于聊天、文本到圖像和嵌入模型。支持同步和流API選項。還支持下拉訪問模型特定功能。跨Vector Store提供商的可移植API&#xff0c;包括同樣可移植的新穎…

ELK常見的問題

ELK 棧在使用過程中會遇到各種問題&#xff0c;以下是常見問題分類及解決方案&#xff0c;涵蓋 ?Elasticsearch、Logstash、Kibana 和 Beats&#xff08;如 Filebeat&#xff09;?? 四大組件&#xff1a; &#x1f6a8; ?一、連接與通信問題? 1. ?Elasticsearch 拒絕連接…