spójrz na następujące posty na blogu:
1) COUNT(***) vs COUNT(col)
2) Łatwe wskazówki dotyczące wydajności MySQL
3) Szybki licznik (*) dla InnoDB
przy okazji, jakiego silnika używasz?
EDYTOWANO: O technice przyspieszania liczenia, kiedy musisz tylko wiedzieć, czy jest jakaś liczba rzędów. Przepraszam, po prostu myliłem się z moim zapytaniem. Tak więc, gdy trzeba tylko wiedzieć, czy istnieje m.in. 300 wierszy według określonego warunku, możesz wypróbować podzapytanie:
select count(*) FROM
( select 1 FROM _table_ WHERE _conditions_ LIMIT 300 ) AS result
najpierw minimalizujesz zestaw wyników, a następnie liczysz wynik; nadal będzie skanować zbiór wyników, ale możesz go ograniczyć (raz jeszcze działa, gdy pytanie do DB brzmi "jest tutaj więcej lub mniej niż 300 wierszy), a jeśli DB zawiera więcej niż 300 wierszy, które spełniają warunek, że zapytanie jest szybsze
Wyniki testów (moja tabela ma 6,7 mln wierszy):
1) SELECT count(*) FROM _table_ WHERE START_DATE > '2011-02-01'
zwraca 4,2 mln przez 65,4 sekundy
2) SELECT count(*) FROM ( select 1 FROM _table_ WHERE START_DATE > '2011-02-01' LIMIT 100 ) AS result
zwraca 100 przez 0,03 sekundy
Poniżej znajduje się wynik zapytania wyjaśniającego, aby zobaczyć, co się tam dzieje:
EXPLAIN SELECT count(*) FROM ( select 1 FROM _table_ WHERE START_DATE > '2011-02-01' LIMIT 100 ) AS result