91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺析分批分頁查詢場景及方案

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2026-04-03 16:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

背景

在日常開發(fā)中,不可避免的要用到分批查詢或分頁查詢,其中的場景有很多,有的是WEB頁面的分頁查詢效果,或移動端向下滑動的分頁查詢,有的則是因為目標(biāo)數(shù)據(jù)量巨大,不得已而分批查詢。無論是出于性能考慮,還是大報文考慮,抑或頁面的效果,分批或分頁查詢都是研發(fā)的日常。

wKgZPGnPd5CAHOi_AAgCL7I7XRY918.png

?

wKgZO2nPd5KAP4JmABDolRcxkzw412.png

?

本文嘗試,對日常項目用到的分批分頁查詢做一下方案的回顧和淺析。

查詢場景及方案

一、普通分批分頁查詢場景

方案1 普通LIMIT OFFSET分頁查詢方式

通過數(shù)據(jù)庫直接LIMIT OFFSET 的方式是最簡單,也是最常用的分頁查詢方式。

SELECT
	id,
	warehouse_no,
	location_no,
	sku,
	sku_level,
	lot_no,
	pack_code,
	owner_no,
	extend_content
FROM
	st_stock
WHERE
	deleted = 0
	AND warehouse_no = '6_666'
ORDER BY
	id ASC 
LIMIT 100,10

該方法直接簡單,開發(fā)和運維簡單,可讀性高,但當(dāng)offset值(偏移量)非常大時,弊端也比較明顯:深分頁性能問題比較嚴重,例如 LIMIT 1000000, 10 。

?

當(dāng)執(zhí)行LIMIT 1000000, 10時,SQL的處理流程是:

掃描并讀取前1,000,000條記錄

丟棄這1,000,000條記錄

返回接下來的10條記錄

這意味著即使只需要10條數(shù)據(jù),數(shù)據(jù)庫也必須訪問和處理大量的"無用"數(shù)據(jù)。

?

簡言之,深分頁,IO開銷大:需要讀取大量無用數(shù)據(jù)頁;內(nèi)存消耗高:大量數(shù)據(jù)加載到內(nèi)存后被丟棄;CPU消耗高:排序、過濾操作消耗大量CPU資源。

?

方案2 基于子查詢或二次查詢的分頁查詢

SELECT
	s.id,
	warehouse_no,
	location_no,
	sku,
	sku_level,
	lot_no,
	pack_code,
	owner_no,
	extend_content
FROM
	st_stock s
JOIN
	(
		SELECT
			id
		FROM
			st_stock
		WHERE
			deleted = 0
			AND warehouse_no = '6_666'
		ORDER BY
			id ASC LIMIT 100,10
	)
	s2
ON
	s.id = s2.id

SELECT
    s.id,
    s.warehouse_no,
    s.location_no,
    s.sku,
    s.sku_level,
    s.lot_no,
    s.pack_code,
    s.owner_no,
    s.extend_content
FROM st_stock s
WHERE EXISTS (
    SELECT 1
    FROM (
        SELECT id
        FROM st_stock
        WHERE deleted = 0
            AND warehouse_no = '6_666'
        ORDER BY id ASC
        LIMIT 100,10
    ) AS s2
    WHERE s.id = s2.id
);

?

除了直接在SQL中進行分頁處理,還可以通過二次查詢的方式來實現(xiàn)。

第一步,先分頁查詢id列表;

SELECT id
FROM st_stock
WHERE deleted = 0
    AND warehouse_no = '6_666'
ORDER BY id ASC
LIMIT 100,10;

id字段有主鍵索引,避免回表。

?

第二步,以第一步的id列表作為in條件,查詢庫存信息。

SELECT
    id,
    warehouse_no,
    location_no,
    sku,
    sku_level,
    lot_no,
    pack_code,
    owner_no,
    extend_content
FROM st_stock
WHERE id IN (id1, id2, id3, ...);

?

注意:下面的SQL方式是錯誤的,SQL語法不支持:

SELECT
	id,
	warehouse_no,
	location_no,
	sku,
	sku_level,
	lot_no,
	pack_code,
	owner_no,
	extend_content
FROM
	st_stock s
    where id in 
	(
		SELECT
			id
		FROM
			st_stock
		WHERE
			deleted = 0
			AND warehouse_no = '6_666'
		ORDER BY
			id ASC LIMIT 100,10
	)

SQL 錯誤 [1235] [42000]: This version of SQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

解決方案就是使用上面的方式實現(xiàn)。

?

方案3 游標(biāo)分頁,滾動式查詢

SELECT
	id,
	warehouse_no,
	location_no,
	sku,
	sku_level,
	lot_no,
	pack_code,
	owner_no,
	extend_content
FROM
	st_stock
WHERE
	deleted = 0
	AND warehouse_no = '6_666'
        AND id > 100
ORDER BY
	id ASC 
LIMIT 10

與方案一相比,最大的區(qū)別是增加了id條件,本次id的條件是上一次查詢結(jié)果集中的最大id,通過id滾動式查詢,縮小檢索范圍。

?

wKgZPGnPd5SAa-14AAW7X17KtVE538.png

上圖就是一個游標(biāo)分頁查詢的案例。

?

二、動態(tài)數(shù)據(jù)分批分頁導(dǎo)出查詢場景

對于動態(tài)變化的數(shù)據(jù),想要分批分頁導(dǎo)出,而且想要保證數(shù)據(jù)的準(zhǔn)確性,該如何處理呢?

方案1 對目標(biāo)數(shù)據(jù)加鎖

將導(dǎo)出條件對應(yīng)的目標(biāo)數(shù)據(jù)鎖定,導(dǎo)出結(jié)束后再解鎖這批數(shù)據(jù)。導(dǎo)出時間被鎖定的數(shù)據(jù)行,不能update、delete,可以select。

id SKU …… locked
2019609892142206976 123 …… 1
2019695225349345280 456 …… 1
2019326832070885376 789 …… 1
2027414057350348800 110 …… 0
2027414069316685824 118 …… 0

?

優(yōu)勢

?可以保持在導(dǎo)出期間穩(wěn)定導(dǎo)出數(shù)據(jù),減少因為數(shù)據(jù)的動態(tài)變化影響數(shù)據(jù)的準(zhǔn)確性。

?如果在導(dǎo)出期間,符合條件的數(shù)據(jù)庫行有新增(insert),在數(shù)據(jù)庫主鍵ID遞增的情況下,新增行的id更大,排序在后,可以正常導(dǎo)出這部分新增數(shù)據(jù),不受影響。

?

劣勢

?鎖定的這部分導(dǎo)出數(shù)據(jù),在導(dǎo)出期間,只讀,不能執(zhí)行寫服務(wù),相當(dāng)于停產(chǎn)導(dǎo)出,適合于生產(chǎn)低谷時段或停產(chǎn)時段進行導(dǎo)出。

?

?

方案2 生成導(dǎo)出數(shù)據(jù)快照

將導(dǎo)出條件對應(yīng)的目標(biāo)數(shù)據(jù)生成導(dǎo)出庫存快照數(shù)據(jù),導(dǎo)出執(zhí)行是將本次版本的快照數(shù)據(jù)導(dǎo)出,導(dǎo)出數(shù)據(jù)快照過時可以清理。

實時數(shù)據(jù)

id SKU ……
2019609892142206976 123 ……
2019695225349345280 456 ……
2019326832070885376 789 ……
2027414057350348800 110 ……
2027414069316685824 118 ……

?

快照數(shù)據(jù)

id SKU ……
2019609892142206976 123 ……
2019695225349345280 456 ……
2019326832070885376 789 ……

?

優(yōu)勢

?在數(shù)據(jù)導(dǎo)出期間穩(wěn)定導(dǎo)出數(shù)據(jù),每次導(dǎo)出的數(shù)據(jù)都有單獨的導(dǎo)出數(shù)據(jù)快照版本,導(dǎo)出期間數(shù)據(jù)的準(zhǔn)確性得到保障。

?在數(shù)據(jù)導(dǎo)出期間,即使有數(shù)據(jù)的變化,也不影響導(dǎo)出效果。不鎖數(shù)據(jù)行,不影響生成生產(chǎn)作業(yè)。

?

劣勢

?如果在導(dǎo)出期間,符合條件的數(shù)據(jù)庫行有新增(insert),這部分數(shù)據(jù)即使符合導(dǎo)出條件,也不會導(dǎo)出,因為這部分新增的數(shù)據(jù)在導(dǎo)出數(shù)據(jù)快照之后生成,并未在快照數(shù)據(jù)中。

?需要生成導(dǎo)出數(shù)據(jù)快照,導(dǎo)出數(shù)據(jù)快照版本需要單獨的庫表存儲,同時也會占用磁盤資源。

?導(dǎo)出數(shù)據(jù)快照生成期間,倘若符合條件的數(shù)據(jù)行有變化,需要對快照數(shù)據(jù)生成特殊處理,比如一次性生成快照等方式。

?

三、內(nèi)存分頁查詢場景

在日常研發(fā)過程中遇到的分頁查詢,大部分都可以借助SQL數(shù)據(jù)庫、ES等存儲中間件自身的分頁功能實現(xiàn),但個別場景下并不符合,比如數(shù)據(jù)并未存儲在SQL數(shù)據(jù)庫或ES中,而是內(nèi)存計算出來的一種結(jié)果數(shù)據(jù);或者數(shù)據(jù)庫中存儲的數(shù)據(jù)維度并不符合,并不能通過簡單的GROUP BY等方式實現(xiàn)維度加工;或者數(shù)據(jù)庫中存儲的數(shù)據(jù),需要通過第三方RPC遠程接口實時獲取特殊屬性打標(biāo)過濾后,才可以作為目標(biāo)數(shù)據(jù)使用。

在這些場景下,我們會用到內(nèi)存分頁的方式處理。

?

內(nèi)存分頁方案

wKgZO2nPd5SACPU-AASGd8cuHl4889.png

?

wKgZPGnPd5WAANthAAJ10yGnWj8204.png

?

上面的示例,是一個簡單的內(nèi)存分頁處理方式。

總結(jié)

本文回顧了日常研發(fā)過程中,經(jīng)常遇到的普通分批分頁查詢場景、動態(tài)數(shù)據(jù)分批分頁導(dǎo)出查詢場景、內(nèi)存分頁查詢等場景,探討了對應(yīng)的解決方案。方案并非固定一成不變的,也有各自的利弊和局限性,在合適場景下,選擇合適的方案即可。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 京東
    +關(guān)注

    關(guān)注

    2

    文章

    1126

    瀏覽量

    50134
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    MySQL數(shù)據(jù)庫慢查詢分析與優(yōu)化實戰(zhàn)

    在討論MySQL慢查詢之前,需要先明確一個關(guān)鍵前提:什么是慢查詢? 不同業(yè)務(wù)場景下,慢查詢的定義差異巨大。一個數(shù)據(jù)報表后臺的SQL執(zhí)行30秒可能屬于正常范圍,但一個訂單創(chuàng)建的數(shù)據(jù)庫操作
    的頭像 發(fā)表于 04-02 09:38 ?98次閱讀

    2026年HUB芯片方案選擇洞察:從傳輸效率到場景適配的專業(yè)分析與推薦

    隨著Type-C接口普及、高速數(shù)據(jù)傳輸需求激增,HUB芯片已成為消費電子、辦公設(shè)備與工業(yè)場景的“連接核心”。對于正處于方案評估階段的企業(yè)或開發(fā)者而言,選擇一款適配自身場景的HUB芯片,需跳出“只看
    發(fā)表于 03-20 18:49

    MUN3CAD03-SF:多場景電源模塊替代的優(yōu)選方案

    MUN3CAD03-SF:多場景電源模塊替代的優(yōu)選方案在電子設(shè)計領(lǐng)域,電源模塊的選型直接決定系統(tǒng)性能與穩(wěn)定性,MUN3CAD03-SF作為一款主流DC-DC電源模塊,雖具備過流保護(OCP)、過溫
    發(fā)表于 02-02 09:51

    MUN3CAD03-SF:多場景電源模塊替代的優(yōu)選方案

    MUN3CAD03-SF:多場景電源模塊替代的優(yōu)選方案在電子設(shè)計領(lǐng)域,電源模塊的選型直接決定系統(tǒng)性能與穩(wěn)定性,MUN3CAD03-SF作為一款主流DC-DC電源模塊,雖具備過流保護(OCP)、過溫
    發(fā)表于 01-30 09:11

    從0到1搭建實時日志監(jiān)控系統(tǒng):基于WebSocket + Elasticsearch的實戰(zhàn)方案

    if(this.logs.length>1000)this.logs.pop();// 限制數(shù)量 }; 4. 性能優(yōu)化與坑點 ES查詢優(yōu)化 :使用search_after替代from/size,避免深度分頁性能
    發(fā)表于 01-09 16:43

    Neway電機方案在電機控制的應(yīng)用場景

    Neway電機方案在電機控制的應(yīng)用場景Neway電機方案在電機控制領(lǐng)域的應(yīng)用場景廣泛且效果顯著,其核心優(yōu)勢在步進電機、伺服電機控制及CNC機床主軸驅(qū)動等
    發(fā)表于 01-04 10:10

    微店商品列表API,輕松采集商品列表數(shù)據(jù)

    微店商品列表API是微店開放平臺提供的核心接口,主要用于獲取指定店鋪的商品列表數(shù)據(jù)。該接口支持分頁查詢、條件篩選和排序功能,適用于電商管理系統(tǒng)、競品分析和多平臺展示等場景。 一、接口概述 1.
    的頭像 發(fā)表于 12-01 14:32 ?521次閱讀

    OBOO鷗柏丨110英寸大屏國產(chǎn)化麒麟系統(tǒng)觸摸屏人才市場信息查詢

    ,為人才市場招聘查詢帶來了全新的解決方案。從場景化主體特點來看,人才市場人流量大,招聘信息查詢需求高。OBOO鷗柏的這款觸摸屏采用110寸臥式設(shè)計,符合人體工程學(xué),
    的頭像 發(fā)表于 11-28 18:40 ?514次閱讀
    OBOO鷗柏丨110英寸大屏國產(chǎn)化麒麟系統(tǒng)觸摸屏人才市場信息<b class='flag-5'>查詢</b>

    商品類目屬性查詢接口技術(shù)實現(xiàn)詳解

    ? ? 一、接口核心功能 該接口用于查詢電商系統(tǒng)中商品類目的屬性信息,支持: 按類目ID查詢屬性集合 按屬性類型過濾(關(guān)鍵屬性$K$、銷售屬性$S$、普通屬性$N$) 分頁返回屬性數(shù)據(jù) 多語言屬性名
    的頭像 發(fā)表于 10-11 15:43 ?541次閱讀
    商品類目屬性<b class='flag-5'>查詢</b>接口技術(shù)實現(xiàn)詳解

    別踩分頁坑!京東商品詳情接口實戰(zhàn)指南:從并發(fā)優(yōu)化到數(shù)據(jù)完整性閉環(huán)

    京東商品詳情接口(jingdong.ware.get)是電商數(shù)據(jù)開發(fā)的核心難點,本文詳解其權(quán)限申請、分頁優(yōu)化、多規(guī)格遞歸解析與完整性校驗等實戰(zhàn)方案,結(jié)合代碼示例與性能調(diào)優(yōu)參數(shù),助你高效穩(wěn)定對接,提升數(shù)據(jù)獲取效率2.5倍以上,適用于各類規(guī)模店鋪的數(shù)據(jù)需求。
    的頭像 發(fā)表于 09-30 15:50 ?1171次閱讀

    常用PromQL查詢案例總結(jié)

    在云原生時代,Prometheus已經(jīng)成為監(jiān)控領(lǐng)域的事實標(biāo)準(zhǔn)。作為一名資深運維工程師,我見過太多團隊在PromQL查詢上踩坑,也見過太多因為監(jiān)控不到位導(dǎo)致的生產(chǎn)事故。今天分享10個實戰(zhàn)中最常用的PromQL查詢案例,每一個都是血淚經(jīng)驗的總結(jié)。
    的頭像 發(fā)表于 09-18 14:54 ?816次閱讀

    產(chǎn)品詳情查詢API接口

    ,使用HTTP協(xié)議實現(xiàn)數(shù)據(jù)傳輸,支持多種應(yīng)用場景,包括電商平臺、移動應(yīng)用和數(shù)據(jù)分析系統(tǒng)。本文將逐步介紹產(chǎn)品詳情查詢API接口的核心概念、工作原理、實現(xiàn)方法以及實際應(yīng)用示例,幫助開發(fā)者快速上手。 什么是產(chǎn)品詳情查詢API接口? 產(chǎn)
    的頭像 發(fā)表于 07-24 14:39 ?661次閱讀
    產(chǎn)品詳情<b class='flag-5'>查詢</b>API接口

    無硅油與含硅油導(dǎo)熱片: 精準(zhǔn)匹配不同場景的散熱解決方案

    決策:使用含硅油導(dǎo)熱片還是無硅油導(dǎo)熱片?事實上,這兩種材料并非替代關(guān)系,而是針對不同應(yīng)用場景的互補解決方案。理解它們各自的特性和適用領(lǐng)域,能為電子設(shè)備散熱設(shè)計提供更精準(zhǔn)的匹配方案。 一、材料特性
    發(fā)表于 07-14 17:04

    媒體查詢詳解

    概述 媒體查詢作為響應(yīng)式設(shè)計的核心,在移動設(shè)備上應(yīng)用十分廣泛。媒體查詢可根據(jù)不同設(shè)備類型或同設(shè)備不同狀態(tài)修改應(yīng)用的樣式。媒體查詢常用于下面兩種場景: 針對設(shè)備和應(yīng)用的屬性信息(比如
    發(fā)表于 06-25 08:26

    同步電機失步淺析

    純分享帖,需要者可點擊附件免費獲取完整資料~~~*附件:同步電機失步淺析.pdf【免責(zé)聲明】本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請第一時間告知,刪除內(nèi)容!
    發(fā)表于 06-20 17:42