成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL分頁,求求你別再用offset和limit了!

數據庫
隨著時代的進步,隨著野心勃勃的企業想要變成下一個 Facebook,隨著為機器學習預測收集盡可能多數據的想法的出現,作為開發人員,我們要不斷地打磨我們的 API,讓它們提供可靠和有效的端點,從而毫不費力地瀏覽海量數據。

不需要擔心數據庫性能優化問題的日子已經一去不復返了。

隨著時代的進步,隨著野心勃勃的企業想要變成下一個 Facebook,隨著為機器學習預測收集盡可能多數據的想法的出現,作為開發人員,我們要不斷地打磨我們的 API,讓它們提供可靠和有效的端點,從而毫不費力地瀏覽海量數據。

如果你做過后臺開發或數據庫架構,你可能是這么分頁的:

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

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

我想你很難找出一個不使用 OFFSET 和 LIMIT 進行數據庫分頁的人。對于簡單的小型應用程序和數據量不是很大的場景,這種方式還是能夠“應付”的。

如果你想從頭開始構建一個可靠且高效的系統,在一開始就要把它做好。

今天我們將探討已經被廣泛使用的分頁方式存在的問題,以及如何實現高性能分頁。

OFFSET 和 LIMIT 有什么問題?

正如前面段落所說的那樣,OFFSET 和 LIMIT 對于數據量少的項目來說是沒有問題的。

但是,當數據庫里的數據量超過服務器內存能夠存儲的能力,并且需要對所有數據進行分頁,問題就會出現。

為了實現分頁,每次收到分頁請求時,數據庫都需要進行低效的全表掃描。

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

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

也就是說,為了獲取一頁的數據:

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

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

如果你不相信,可以看看這個例子:https://www.db-fiddle.com/f/3JSpBxVgcqL3W2AzfRNCyq/1?ref=hackernoon.com

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

數據越多,情況就越糟。看看我對 10 萬行數據進行的 PoC

https://github.com/IvoPereira/Efficient-Pagination-SQL-PoC?ref=hackernoon.com

現在你應該知道這背后都發生了什么:OFFSET 越高,查詢時間就越長。

替代方案

你應該這樣做:

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

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

為什么?因為通過顯式告知數據庫最新行,數據庫就確切地知道從哪里開始搜索(基于有效的索引),而不需要考慮目標范圍之外的記錄。

比較這個查詢:

圖片

和優化的版本:

圖片

返回同樣的結果,第一個查詢使用了 12.80 秒,而第二個僅用了 0.01 秒。

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

我的建議是,不管怎樣都要考慮每種解決方案的優缺點,以及需要執行哪種查詢。

如果需要基于大量數據做查詢操作,Rick James 的文章提供了更深入的指導。

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


責任編輯:華軒 來源: 數據前線
相關推薦

2021-06-09 06:41:11

OFFSETLIMIT分頁

2020-12-15 08:06:45

waitnotifyCondition

2020-12-11 09:24:19

Elasticsear存儲數據

2020-12-04 10:05:00

Pythonprint代碼

2020-12-02 11:18:50

print調試代碼Python

2020-06-15 08:12:51

try catch代碼處理器

2024-03-14 08:15:18

COUNT(*)數據庫LIMIT 1?

2024-06-12 13:54:37

編程語言字符串代碼

2020-11-09 08:22:29

程序員 IT科技

2020-12-07 06:05:34

apidocyapiknife4j

2021-05-11 07:10:18

標準庫DjangoOS

2020-09-22 09:05:45

MySQLUTF-8utf8mb4

2025-05-19 04:00:00

2023-12-08 14:37:51

接口jar包開發

2022-09-07 07:37:06

LIMITOFFSET分頁

2021-01-29 11:05:50

PrintPython代碼

2020-12-03 09:05:38

SQL代碼方案

2023-10-26 16:33:59

float 布局前段CSS

2021-05-25 09:30:44

kill -9Linux kill -9 pid

2020-04-16 08:22:11

HTTPS加解密協議
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 四虎影院新地址 | 国产精品久久久久久久粉嫩 | 97国产精品 | 国内毛片毛片毛片毛片 | wwww.8888久久爱站网 | 黄色网毛片 | 国产福利在线 | 亚洲精品1区 | 日韩在线免费看 | 亚洲成人在线免费 | 午夜激情一区 | 国产成人精品久久二区二区 | 亚欧精品一区 | 日韩精品一区二区三区中文在线 | 网络毛片 | 国产精品视频不卡 | 亚洲视频a| 日本中出视频 | 国产视频久久 | 久久国产精品一区二区三区 | 精品亚洲一区二区三区 | 国产高清视频在线观看 | 成人精品毛片 | 欧美日韩黄 | 亚洲国产一区视频 | 日本韩国电影免费观看 | 二区三区av | 亚洲综合在线一区二区 | 成人三区 | 中文字幕一区二区三区四区五区 | 国产精品资源在线观看 | 91国在线| 国产成人99久久亚洲综合精品 | 国产亚洲精品成人av久久ww | 成人在线小视频 | 久久久久久久久99 | 在线成人免费av | 精久久久 | 久久久久久久久国产成人免费 | 免费一区二区三区 | 自拍视频精品 |