我是廣告,點擊一下吧!
標籤
#Flutter (11) 、 #PHP (4) 、 #Mac (4) 、 #Dart (4) 、 #VS Code (2) 、 #IDE (2) 、 #List (2) 、 #Linux (2) 、 #Shell Script (2) 、 #Android (2) 、 #Laravel (2) 、 #TEST (1) 、 #Widget (1) 、 #單例模式 (Singleton) (1) 、 #MySQL (1) 、 #備份資料庫 (1) 、 #SSH Key (1) 、 #Git (1) 、 #降版 (1) 、 #Flutter package (1) 、 #uni_links (1) 、 #APP Link (1) 、 #Universal Links (1) 、 #Xcode (1) 、 #iOS (1) 、 #SEO (1) 、 #Google Analytics (1) 、 #GA (1) 、 #Google AdSense (1) 、 #NUEiP (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