女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

別再用offset和limit分頁了,OFFSET和LIMIT有什么問題?

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-08-11 09:37 ? 次閱讀

不需要擔(dān)心數(shù)據(jù)庫性能優(yōu)化問題的日子已經(jīng)一去不復(fù)返了。

隨著時(shí)代的進(jìn)步,隨著野心勃勃的企業(yè)想要變成下一個(gè) Facebook,隨著為機(jī)器學(xué)習(xí)預(yù)測(cè)收集盡可能多數(shù)據(jù)的想法的出現(xiàn),作為開發(fā)人員,我們要不斷地打磨我們的 API,讓它們提供可靠和有效的端點(diǎn),從而毫不費(fèi)力地瀏覽海量數(shù)據(jù)。

如果你做過后臺(tái)開發(fā)或數(shù)據(jù)庫架構(gòu),你可能是這么分頁的:

wKgaomTVkSuATqrBAAA1rAwSdIU550.jpg

如果你真的是這么分頁,那么我不得不抱歉地說,你這樣做是錯(cuò)的。

你不以為然?沒關(guān)系。Slack、Shopify 和 Mixmax 這些公司都在用我們今天將要討論的方式進(jìn)行分頁。

我想你很難找出一個(gè)不使用 OFFSET 和 LIMIT 進(jìn)行數(shù)據(jù)庫分頁的人。對(duì)于簡單的小型應(yīng)用程序和數(shù)據(jù)量不是很大的場景,這種方式還是能夠“應(yīng)付”的。

如果你想從頭開始構(gòu)建一個(gè)可靠且高效的系統(tǒng),在一開始就要把它做好。

今天我們將探討已經(jīng)被廣泛使用的分頁方式存在的問題,以及如何實(shí)現(xiàn)高性能分頁。

1、OFFSET 和 LIMIT 有什么問題?

正如前面段落所說的那樣,OFFSET 和 LIMIT 對(duì)于數(shù)據(jù)量少的項(xiàng)目來說是沒有問題的。

但是,當(dāng)數(shù)據(jù)庫里的數(shù)據(jù)量超過服務(wù)器內(nèi)存能夠存儲(chǔ)的能力,并且需要對(duì)所有數(shù)據(jù)進(jìn)行分頁,問題就會(huì)出現(xiàn)。

為了實(shí)現(xiàn)分頁,每次收到分頁請(qǐng)求時(shí),數(shù)據(jù)庫都需要進(jìn)行低效的全表掃描。

什么是全表掃描?全表掃描 (又稱順序掃描) 就是在數(shù)據(jù)庫中進(jìn)行逐行掃描,順序讀取表中的每一行記錄,然后檢查各個(gè)列是否符合查詢條件。這種掃描是已知最慢的,因?yàn)樾枰M(jìn)行大量的磁盤 I/O,而且從磁盤到內(nèi)存的傳輸開銷也很大。

這意味著,如果你有 1 億個(gè)用戶,OFFSET 是 5 千萬,那么它需要獲取所有這些記錄 (包括那么多根本不需要的數(shù)據(jù)),將它們放入內(nèi)存,然后獲取 LIMIT 指定的 20 條結(jié)果。

也就是說,為了獲取一頁的數(shù)據(jù):

10萬行中的第5萬行到第5萬零20行

需要先獲取 5 萬行。這么做是多么低效?

左邊的 Schema SQL 將插入 10 萬行數(shù)據(jù),右邊有一個(gè)性能很差的查詢和一個(gè)較好的解決方案。只需單擊頂部的 Run,就可以比較它們的執(zhí)行時(shí)間。第一個(gè)查詢的運(yùn)行時(shí)間至少是第二個(gè)查詢的 30 倍。

數(shù)據(jù)越多,情況就越糟。看看我對(duì) 10 萬行數(shù)據(jù)進(jìn)行的 PoC。

現(xiàn)在你應(yīng)該知道這背后都發(fā)生了什么:OFFSET 越高,查詢時(shí)間就越長。

2、替代方案

你應(yīng)該這樣做:

wKgaomTVkPuABb-4AAA80HENH3I506.jpg

這是一種基于指針的分頁。

你要在本地保存上一次接收到的主鍵 (通常是一個(gè) ID) 和 LIMIT,而不是 OFFSET 和 LIMIT,那么每一次的查詢可能都與此類似。

為什么?因?yàn)橥ㄟ^顯式告知數(shù)據(jù)庫最新行,數(shù)據(jù)庫就確切地知道從哪里開始搜索(基于有效的索引),而不需要考慮目標(biāo)范圍之外的記錄。

比較這個(gè)查詢:

wKgZomTVkPuAPlPRAABneBQ-sA0433.jpg

和優(yōu)化的版本:

wKgaomTVkPuAGssfAACUmeiNU5Y939.jpg

返回同樣的結(jié)果,第一個(gè)查詢使用了 12.80 秒,而第二個(gè)僅用了 0.01 秒。

要使用這種基于游標(biāo)的分頁,需要有一個(gè)惟一的序列字段 (或多個(gè)),比如惟一的整數(shù) ID 或時(shí)間戳,但在某些特定情況下可能無法滿足這個(gè)條件。

我的建議是,不管怎樣都要考慮每種解決方案的優(yōu)缺點(diǎn),以及需要執(zhí)行哪種查詢。

如果我們的表沒有主鍵,比如是具有多對(duì)多關(guān)系的表,那么就使用傳統(tǒng)的 OFFSET/LIMIT 方式,只是這樣做存在潛在的慢查詢問題。我建議在需要分頁的表中使用自動(dòng)遞增的主鍵,即使只是為了分頁。






審核編輯:劉清

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

    關(guān)注

    38

    文章

    7629

    瀏覽量

    166325
  • PoC
    PoC
    +關(guān)注

    關(guān)注

    1

    文章

    75

    瀏覽量

    20816
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    780

    瀏覽量

    44787
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8488

    瀏覽量

    134012

原文標(biāo)題:別再用 offset 和 limit 分頁了,性能太差!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

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

    PGA308為什么加兩個(gè)offset,Coarse offset及Fine offset?用一個(gè)offset不能調(diào)零嗎?

    PGA308為什么加兩個(gè)offset,Coarse offset及Fine offset?用一個(gè)offset不能調(diào)零嗎?
    發(fā)表于 08-22 07:22

    關(guān)于選型時(shí)POWER MOSFET的Id的Silicon limit和package limit的看法

    在POWER MOSFET數(shù)據(jù)手冊(cè)上,有些手冊(cè)上只標(biāo)明了Silicon limit,而且這個(gè)值往往很大。請(qǐng)問,在實(shí)際應(yīng)用時(shí),應(yīng)該參照哪一個(gè)Id值。
    發(fā)表于 12-17 10:35

    OFFSET約束問題

    嗨,大家好,據(jù)我所知,OFFSET約束強(qiáng)加于所有輸入PAD。在我的設(shè)計(jì)中,使用了兩個(gè)時(shí)鐘輸入。因此,PAD上的輸入信號(hào)應(yīng)分組為:1.需要OFFSET約束時(shí)間值#1,參考時(shí)鐘輸入#12.需要
    發(fā)表于 05-29 13:51

    看看nginx的連接頻率limit_conn_module和請(qǐng)求頻率limit_req_module限制模塊

    : -Context: http, server, location這里個(gè)前提必須在http下先定義好limit_conn_zone才可以在這里引用。這里的zone就是上面zone的名字,number就是同一時(shí)間
    發(fā)表于 10-19 14:20

    CDMA Access pn offset與距離的公式測(cè)定

    CDMA Access_pn_offset與距離的公式測(cè)定:本文測(cè)定Motorola CDMA系統(tǒng)中Access_pn_offset與距離的關(guān)系,解決長期以來困擾無線工程師的CDM
    發(fā)表于 07-27 21:53 ?40次下載

    Timing Groups and OFFSET Const

    Timing Groups and OFFSET Constraints: •Use the Constraints Editor to create groups of path
    發(fā)表于 01-11 08:55 ?4次下載

    DC Offset Auto-Calibration of

    ABSTRACTThe TRF371x family provides an automatic calibration circuit to minimize the DC offset
    發(fā)表于 07-08 16:23 ?17次下載

    Current-Limit Switch Is Digita

    Abstract: Current-limit switches are virtually ubiquitous in system controls. They provide a safe
    發(fā)表于 05-08 09:56 ?3179次閱讀
    Current-<b class='flag-5'>Limit</b> Switch Is Digita

    OFFSET約束的寫法(OFFSET IN和OFFSET OUT)

    1. OFFSET約束的寫法 Offset 約束定義外部時(shí)鐘pad和與之相關(guān)的輸入、輸出pad之間的相對(duì)關(guān)系。這是一個(gè)基礎(chǔ)的時(shí)序約束。Offset定義的是外部之間的關(guān)系,不能用在內(nèi)部
    發(fā)表于 02-08 13:22 ?2405次閱讀
    <b class='flag-5'>OFFSET</b>約束的寫法(<b class='flag-5'>OFFSET</b> IN和<b class='flag-5'>OFFSET</b> OUT)

    ngx_dynamic_limit_req_module IP動(dòng)態(tài)鎖定工具

    ./oschina_soft/ngx_dynamic_limit_req_module.zip
    發(fā)表于 05-07 09:29 ?0次下載
    ngx_dynamic_<b class='flag-5'>limit</b>_req_module IP動(dòng)態(tài)鎖定工具

    MySQL用limit為什么會(huì)影響性能

    一張財(cái)務(wù)流水表,未分庫分表,目前的數(shù)據(jù)量為9555695,分頁查詢使用到了limit,優(yōu)化之前的查詢耗時(shí)16 s 938 ms (execution: 16 s 831 ms, fetching
    的頭像 發(fā)表于 06-20 16:31 ?1723次閱讀

    offset新探索:雙管齊下,加速大數(shù)據(jù)量查詢

    眾所周知,在各類業(yè)務(wù)中時(shí)常會(huì)用到LIMIT y offset x來做跳過x條數(shù)據(jù)讀取Y條數(shù)據(jù)的操作。例如:SELECT * FROM ... LIMIT 1000 OFFSET 100
    的頭像 發(fā)表于 11-24 14:45 ?671次閱讀
    <b class='flag-5'>offset</b>新探索:雙管齊下,加速大數(shù)據(jù)量查詢

    VSync offset定義的方法

    VSync-offset/duration 虛擬化后的VSync還有一個(gè)好處,就是可以對(duì)VSync進(jìn)行一些定制操作,offset就是其中之一。 接下來就是offset的定義,offset
    的頭像 發(fā)表于 11-21 16:57 ?1580次閱讀
    VSync <b class='flag-5'>offset</b>定義的方法

    mybatis邏輯分頁和物理分頁的區(qū)別

    這兩種分頁方式的區(qū)別。 邏輯分頁是在數(shù)據(jù)庫中執(zhí)行查詢時(shí)使用的一種分頁方式。這種方式是通過在查詢語句中添加LIMITOFFSET關(guān)鍵字來限制
    的頭像 發(fā)表于 12-03 14:54 ?1161次閱讀

    oracle數(shù)據(jù)庫limit怎么用

    在Oracle數(shù)據(jù)庫中,可以使用ROWNUM來實(shí)現(xiàn)類似LIMIT的功能。ROWNUM是Oracle數(shù)據(jù)庫提供的一個(gè)偽列,它在查詢結(jié)果集中為每一行分配一個(gè)唯一的數(shù)字。 要使用ROWNUM進(jìn)行分頁查詢
    的頭像 發(fā)表于 12-06 10:05 ?2493次閱讀