2011-11-26 11 views
5

Po prostu muszę wiedzieć, czy zapytanie zwraca, czy nie rekord.Najszybsze zapytanie, czy zwraca co najmniej jeden wiersz

Oczywiście mogę to zrobić:

SELECT COUNT(*) FROM tbl WHERE conds; 

Ale to zwraca dokładną liczbę wierszy (oczywiście), a ja nie potrzebuję tego narzutu.

Więc pomyślałem tej kwerendy:

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

ograniczając zapytanie wewnętrznego 1.

Czy to szybciej? Czy biorąc pod uwagę, że robię podzapytanie, anuluje korzyści z LIMIT 1?

Uwaga: za każdy pyta theirself, nie mogę zastosować LIMIT 1 do pierwszego zapytania, ponieważ doens't pracować

Odpowiedz

7

Wewnętrzna-select w drugim zapytaniu jest zbędny.
Jeśli chcesz tylko sprawdzić co-najmniej jednego rzędu: -

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

A potem ja nazwiemy 'mysql_num_rows ($ result)'? (Powiedzmy, że używam mysql lib) – dynamic

+0

Tak (15 znaków, aby przejść) ... – ajreal

+0

Czy ZAMÓWIENIE BYŁO NIŻE koniecznie? bez zapewnienia, że ​​to nie będzie to samo? – dynamic

3

Dlaczego nie po prostu:

SELECT 1 FROM tbl WHERE conds LIMIT 1 
0

Można zrobić:

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

albo coś podobnego:

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

Czy 'EXISTS (...)' będzie bardziej wydajny niż "SELECT ... LIMIT 1"? –

Powiązane problemy