2011-11-26 34 views
5

Tôi chỉ cần biết truy vấn trả về hay không phải là bản ghi.Truy vấn nhanh nhất để xem liệu nó có trả về ít nhất một hàng

Dĩ nhiên tôi có thể làm điều này:

SELECT COUNT(*) FROM tbl WHERE conds; 

Nhưng điều này trả về chính xác số lượng hàng (tất nhiên), và tôi không cần phải chi phí này.

Vì vậy, tôi nghĩ rằng truy vấn này:

SELECT COUNT(*) FROM (SELECT id FROM tbl WHERE conds LIMIT 1) as t1 

Hạn chế truy vấn nội bộ để 1.

Đây có phải là nhanh hơn? Hoặc xem xét tôi đang làm một truy vấn phụ, nó sẽ hủy bỏ các lợi ích của LIMIT 1?

Lưu ý: for everyone hỏi theirself, tôi không thể áp dụng LIMIT 1 để truy vấn đầu tiên bởi vì nó doens't làm việc

Trả lời

7

Các nội chọn trong truy vấn thứ hai là không cần thiết.
Nếu bạn chỉ muốn kiểm tra tại-nhỏ nhất của một hàng: -

SELECT 1 FROM tbl // return 1 
WHERE conds  // depends on your index and query 
ORDER BY NULL  // avoid file-sort 
LIMIT 1;   // minimum row 
+0

Và sau đó tôi n eed để gọi một 'mysql_num_rows ($ result)'? (Hãy nói rằng tôi đang sử dụng mysql lib) – dynamic

+0

Có (15 ký tự để đi) ... – ajreal

+0

Có phải ORDER BY NULL cần thiết không? mà không cung cấp nó sẽ không giống nhau? – dynamic

3

Tại sao không chỉ:

SELECT 1 FROM tbl WHERE conds LIMIT 1 
0

Bạn có thể làm:

SELECT 1 WHERE EXISTS(SELECT id FROM tbl WHERE CONDITION) 

Hoặc một cái gì đó như:

SELECT 1 WHERE EXISTS (SELECT id FROM tbl WHERE id IN(1000, 1001)) 
+0

'EXISTS (...)' có hiệu quả hơn 'SELECT ... LIMIT 1' không? –

Các vấn đề liên quan