請不要將OFFSET和LIMIT用於分頁

2021-10-07 23:04:21 字數 754 閱讀 7615

隨著時代的發展,每個新企業家都希望建立下乙個facebook,並結合收集每個可能的資料點以提供更好的機器學習**的心態,作為開發人員,我們需要比以往更好地準備我們的api,以提供可靠,高效的端點,應該能夠毫不費力地瀏覽大量資料。

如果您已經進行了一段時間的後端或資料庫體系結構,則可能已經完成了分頁查詢

offset和limit有什麼問題?

正如我們在前面的段落中簡要**的那樣,offset和limit非常適合於資料使用量很少甚至沒有的專案。

當資料庫開始收集的資料量超出伺服器可以儲存在記憶體中的資料量時,仍然會出現問題,您仍然需要對它們全部進行效能分頁。

為此,每次您請求分頁時,資料庫都需要執行低效的全表掃瞄(插入和刪除操作可能同時發生,我們不希望資料過時!)。

什麼是全表掃瞄?全表掃瞄(也稱為順序掃瞄)是在資料庫中進行的掃瞄,其中順序讀取表中的每一行,然後檢查遇到的列是否符合條件。由於從磁碟進行大量的i / o讀取(包括多次搜尋)以及昂貴的磁碟到記憶體傳輸,這種型別的掃瞄被認為是最慢的。

這意味著,如果您有100.000.000使用者,而您要求的偏移量為50.000.000,則它將需要獲取所有這些記錄(甚至不需要!),將它們儲存在記憶體中,只有在獲得之後, limit中指定了20個結果。

因此,要在**上顯示這樣的分頁:

50.000至50.020之100.000

它首先需要獲取50.000行。看看這效率低下嗎?

我建議在要分頁的表中使用自動遞增的主鍵,即使只是出於分頁的目的。

請不要忘記學習索引。並解釋查詢。

Limit 和 offset簡單實用

limit 起始條目索引 條目數 特點 起始條目索引從0開始,起始條目索引可省略 limit 條目數 offset 起始條目索引 特點 起始條目索引從0開始,起始條目索引可省略 例子select from 表名 limit 3,1 從第4條資料開始取數,取1條資料,即只取第四條 select fro...

MySQL中 limit和offset用法

mysql裡分頁一般用limit來實現 select from article limit 1,3 select from article limit 3 offset 1 上面兩種寫法都表示取2,3,4三條資料。當limit後面跟兩個引數的時候,第乙個數表示要跳過的數量,後一位表示要取的數量,例如...

hdu 3789 請不要將所有國家排序

坑爹,考浙大的研究生果然都不是一般人 include stdio.h include string.h define m 100 int best m int final m int n,m int data m 3 int state m void refresh int ini,int w vo...