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 đọc

Hướ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