我是廣告,點擊一下吧!
標籤
#Flutter (11) 、 #PHP (8) 、 #Laravel (6) 、 #Mac (4) 、 #Dart (4) 、 #MySQL (4) 、 #VS Code (2) 、 #IDE (2) 、 #List (2) 、 #Android (2) 、 #Linux (2) 、 #Shell Script (2) 、 #addMonthNoOverflow (1) 、 #Deferred Join (1) 、 #subMonthNoOverflow (1) 、 #floorMonth (1) 、 #資安 (1) 、 #SVG (1) 、 #Directory Structure (1) 、 #SQL Injection (1) 、 #MySQL 效能 (1) 、 #subMonth (1) 、 #addMonth (1) 、 #Carbon (1) 、 #keytool (1) 、 #Play App Signing (1) 、 #copy (1) 、 #file_put_contents (1) 、 #file_get_contents (1) 、 #fwrite (1)Laravel ORM 的三種 paginate 比較:
使用情境 | 效能 | 總頁數 | 可跳頁 | |
paginate | 皆可 | 慢,每次都要 COUNT(*) | 有 | 可 |
simplePaginate | 不需知道資料總數時用 | 中等,資料多時慢 | 無 | 可 |
cursorPaginate | 無限往下滾動的頁面 | 快 | 無 | 不可 |
cursorPaginate 是 Laravel 8.41 推出的新功能:https://laravel-news.com/cursor-pagination。
以往無限滾動的分頁是用 simplePaginate,但 simplePaginate 底層使用的是 MySQL 中的 limit + offset,當頁數越後面時會讀取越慢,因為 offset 會把資料全都抓出來後再丟棄。
SELECT id, name FROM users LIMIT 10 OFFSET 0 -- 很快
SELECT id, name FROM users LIMIT 10 OFFSET 10000000 -- 超慢,會撈取 10000010 筆資料再丟棄前面的 10000000
cursorPaginate 則是使用 orderBy 的欄位來查詢大/小於前一次的值,利用上一次的值往下或往上查詢。
但記得 orderBy 欄位要有索引,否則查詢還是慢,通常這欄位會是 Integer。
SELECT id, name FROM users id > 10000000 ORDER BY id ASC LIMIT 10
因為是紀錄上一次查詢的值,所以上/下一頁網址就不會是 page=123 這種有序的網址,而是將頭尾數值加密放到 cursor 參數裡
http://localhost/users?cursor=eyJpZCI6MTUsIl9wb2ludHNUb05leHRJdGVtcyI6dHJ1ZX0