Kiểm tra sự tồn tại hiệu quả với SELECT 1
Thay vì SELECT * hoặc SELECT column, dùng SELECT 1 để kiểm tra xem hàng thỏa mãn điều kiện có tồn tại hay không - nhanh hơn, ít I/O hơn, đủ để ứng dụng kiểm tra boolean (có/không).
1. Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName VARCHAR(40),
StudentAge INT
);
mysql> INSERT INTO DemoTable (StudentName, StudentAge) VALUES
('Chris', 21), ('David', 20), ('Bob', 22), ('Tom', 19);
2. Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+-----------+-------------+------------+ | StudentId | StudentName | StudentAge | +-----------+-------------+------------+ | 1 | Chris | 21 | | 2 | David | 20 | | 3 | Bob | 22 | | 4 | Tom | 19 | +-----------+-------------+------------+
3. Truy vấn: Kiểm tra tồn tại 'Bob'
mysql> SELECT 1 FROM DemoTable WHERE StudentName = 'Bob';
4. Kết quả
+---+ | 1 | +---+ | 1 | +---+ 1 row in set
Giải thích:
- Trả về 1 hàng chứa giá trị 1 → Tồn tại
- Trả về Empty set (0 rows) → Không tồn tại
- Chỉ cần 1 hàng (có thể thêm
LIMIT 1)
Ứng dụng trong ứng dụng (PHP/Python/Java):
-- PHP PDO
$stmt = $pdo->prepare("SELECT 1 FROM users WHERE email = ? LIMIT 1");
$stmt->execute([$email]);
$exists = $stmt->fetchColumn(); // false hoặc '1'
So sánh hiệu năng:
| Query | Đọc cột | Network | Dùng index |
|---|---|---|---|
| SELECT 1 FROM t WHERE ... | Không (chỉ index) | Tối thiểu | Có |
| SELECT * FROM t WHERE ... | Tất cả cột | Lớn | Có |
| SELECT COUNT(*) FROM t WHERE ... | Không (chỉ index) | Nhỏ | Có |
| EXISTS (SELECT 1 FROM t WHERE ...) | Không | Tối thiểu | Có |
Best practice: SELECT 1 FROM table WHERE condition LIMIT 1 hoặc EXISTS (SELECT 1 FROM table WHERE condition).