Checkpoint: hiệu năng truy vấn
Quiz
- Một bảng có 2 triệu dòng, AI viết truy vấn đăng nhập lọc theo cột email nhưng bảng chưa có index nào trên email. Theo bài học, việc đầu tiên bạn nên làm là gì?
- Thêm index cho mọi cột của bảng cho chắc
- Đo thời gian thực của truy vấn trước, rồi mới thêm index và đo lại
- Đổi sang NoSQL vì SQL không xử lý nổi bảng 2 triệu dòng
- Thêm ngay index trên email vì bảng lớn thì chắc chắn cần index
- Với composite index, thứ tự cột nên đặt thế nào?
- Cột dùng ORDER BY hoặc khoảng giá trị đứng trước, cột dùng điều kiện bằng đứng sau
- Cột nào có tên ngắn hơn đứng trước
- Cột dùng điều kiện bằng trong WHERE đứng trước, cột dùng sắp xếp hoặc khoảng đứng sau
- Thứ tự cột không quan trọng, miễn là đủ cột
- Trong EXPLAIN của MySQL, dòng kết quả có type = ALL và key = NULL cho biết điều gì?
- Truy vấn đã dùng index và chỉ đọc vài dòng
- Truy vấn đang quét toàn bảng và không dùng index nào
- Truy vấn chỉ đọc dữ liệu từ index, không mở bảng chính
- Database phải sắp xếp thêm sau khi đọc dữ liệu
- Vì sao câu WHERE YEAR(created_at) = 2024 không dùng được index trên created_at, và cách sửa đúng là gì?
- Vì thiếu index composite trên (created_at, YEAR); thêm index đó là xong
- Vì cột created_at kiểu ngày không thể đánh index; phải đổi sang kiểu số
- Vì bảng quá lớn; chỉ cần chạy EXPLAIN ANALYZE là index sẽ được dùng
- Vì hàm bọc quanh cột buộc database tính giá trị cho từng dòng; sửa bằng khoảng created_at >= '2024-01-01' AND created_at < '2025-01-01'
- Đoạn code AI viết lấy 20 đơn hàng rồi với mỗi đơn gọi thêm một truy vấn lấy tên khách. Trang đó sinh ra bao nhiêu truy vấn, và cách sửa gọn nhất khi mỗi đơn thuộc về đúng một khách là gì?
- 21 truy vấn; sửa bằng cách thêm index cho mọi cột của bảng customers
- 20 truy vấn; sửa bằng cách tăng LIMIT lên 200
- 21 truy vấn; sửa bằng JOIN orders với customers trong một truy vấn
- 2 truy vấn; không cần sửa gì
- Khi quan hệ là one-to-many (một đơn có nhiều order_items), vì sao không nên JOIN rồi đặt LIMIT trần 20?
- Vì JOIN không chạy được với quan hệ one-to-many
- Vì JOIN luôn làm index trên khóa ngoại bị vô hiệu
- Vì JOIN nhân dòng, LIMIT có thể cắt mất dữ liệu của các đơn mà không báo lỗi
- Vì LIMIT chỉ hoạt động khi không có ORDER BY
- Trong EXPLAIN của MySQL, cột cho biết index nào thực sự được dùng có tên là ____ (giá trị NULL nghĩa là không dùng index nào).
- Hãy tự đánh giá: bạn có thể nhìn một truy vấn hoặc một đoạn code AI viết và kết luận nó nhanh hay chậm, có dùng index hay không, có mắc N+1 hay không, kèm bằng chứng bằng số không?
Sign in to submit answers.