Phân trang · OFFSET · keyset

OFFSET đọc rồi vứt, keyset nhảy thẳng

Phân trang bằng OFFSET so với keyset Lấy 10 đơn sau order_id 900000 trong perf.orders: LIMIT 10 OFFSET 900000 phải đọc rồi bỏ 900.000 dòng, mất khoảng 60 đến 90 ms; WHERE order_id > 900000 LIMIT 10 dùng chỉ mục khóa chính nhảy thẳng tới vị trí cần, dưới 0,5 ms. perf.orders · 1.000.000 DÒNG, ĐÃ SẮP THEO order_id 1 900.001 → OFFSET trang 90.001 LIMIT 10 OFFSET 900000 đọc và bỏ 900.000 dòng ≈ 60–90 ms 10 dòng trả về KEYSET trang 90.001 WHERE order_id > 900000 LIMIT 10 bỏ qua, không đọc chỉ mục nhảy thẳng tới chỗ cần < 0,5 ms 10 dòng trả về OFFSET càng lớn, database càng phải đọc nhiều dòng chỉ để vứt đi. THỜI GIAN ĐO BẰNG \timing TRÊN MÁY TÁC GIẢ · MÁY BẠN SẼ KHÁC © tiennhm