SELECT * lấy mọi cột của bảng. Tiện lúc khám phá dữ liệu, nhưng trong code chạy thật gây nhiều vấn đề:
- Truyền dữ liệu thừa: kéo cả cột không cần (blob, text lớn) → tốn băng thông, RAM, và I/O.
- Chặn index-only scan: nếu chỉ cần vài cột đã nằm trong index,
SELECT *buộc DB quay lại bảng lấy các cột khác thay vì đọc gọn từ index → mất tối ưu covering index. - Giòn trước thay đổi schema: thêm/đổi thứ tự cột làm kết quả đổi hình dạng bất ngờ, dễ vỡ code dựa theo vị trí cột hoặc gây trùng tên cột khi JOIN.
- Che ý định: người đọc không biết truy vấn thực sự cần cột nào.
sql
-- Thay vì:
SELECT * FROM orders WHERE user_id = 42;
-- Chỉ lấy cột cần (mở đường index-only scan, ổn định trước đổi schema):
SELECT id, total, created_at FROM orders WHERE user_id = 42;Cách đúng: liệt kê đúng cột cần (SELECT id, name, email).
- Vừa nhanh hơn (ít dữ liệu, mở đường index-only scan), vừa rõ ràng và ổn định trước thay đổi schema.
- Ngoại lệ chấp nhận được: truy vấn khám phá thủ công, hoặc
SELECT COUNT(*)(không thực sự đọc cột).