Quét một hướng (Nguyên tắc 2: Scan theo một hướng)
Sau khi nhảy đến một vị trí trong index (bằng Fast Lookup), database có thể đọc liên tục theo MỘT hướng - ascending hoặc descending. Vì leaf nodes của B+ tree liên kết với nhau (linked list), di chuyển sang entry kế tiếp cực nhanh.
SELECT * FROM users WHERE age >= 35 ORDER BY age ASC LIMIT 3;
-- Index (age): [18 | 22 | 25 | 28 | 30 | 35 | 37 | 42 | 48 | 55 | 61]
-- Fast Lookup: age >= 35 ─┘
-- → 35 ✅ → 37 ✅ → 42 ✅ (đủ 3 → DỪNG!)
-- → 48, 55, 61... không cần đọcHướng ngược lại tương tự: WHERE age <= 35 ORDER BY age DESC LIMIT 3 → fast lookup đến 35, scan ngược: 35 → 30 → 28 → DỪNG.
Sức mạnh thực sự khi kết hợp LIMIT
Không có index: bảng 10 triệu row phải scan toàn bộ → filter → sort → lấy 3. Có index: nhảy đến 35 → đọc 3 entries → xong. Từ vài giây xuống dưới 1ms.
Giới hạn quan trọng
Scan chỉ đi một hướng trong một lần index traversal - không thể vừa ascending vừa descending. Nếu query sort theo 2 cột với hướng khác nhau:
ORDER BY score DESC, created_at ASC
-- Index (score, created_at) mặc định (cả hai ASC) KHÔNG đủ:
-- scan backward cho score DESC thì created_at cũng bị DESC!
-- ✅ Cần index khai báo đúng hướng:
CREATE INDEX idx ON highscores (score DESC, created_at ASC);Liên quan
- B+ Tree - leaf nodes là linked list
- ORDER BY và Index - ứng dụng chính của scan một hướng
- Range Condition phá vỡ Phễu - chuyện gì xảy ra khi bắt đầu scan
- Keyset Pagination - phân trang dựa trên scan một hướng