Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kwestia optymalizacji zapytań
Forum PHP.pl > Forum > Bazy danych > MySQL
Maciek_#_&
Witajcie,

Chciałbym się zapytać które zapytanie wykona się szybciej:

1.
  1. SELECT COUNT(*) FROM tabela

2.
  1. SELECT * FROM tabela


I w przypadku przykładu 2, do wyciągnięcia danych zamiast mysql_fetch_assoc jest używany mysql_num_rows

Wstępnie sprawdziłem i 1 przykład ma takie wyniki:
starting 0.000078
checking permissions 0.000011
Opening tables 0.000033
System lock 0.000026
init 0.000015
optimizing 0.000012
executing 0.000010
end 0.000003
query end 0.000003
closing tables 0.000012
freeing items 0.000074
logging slow query 0.000004
cleaning up 0.000003

Natomiast 2:
starting 0.000068
checking permissions 0.000010
Opening tables 0.000869
System lock 0.000021
init 0.000023
optimizing 0.000005
statistics 0.000012
preparing 0.000009
executing 0.000003
Sending data 0.000517
end 0.000015
query end 0.000005
closing tables 0.002774
freeing items 0.000215
logging slow query 0.000006
cleaning up 0.000007

przy tabeli z 9000 rekordów
Nh2003
Zdecydowanie powinienes uzyc
  1. SELECT COUNT(*) FROM tabela


Przy wiekszej ilosci danych wykonanie
  1. SELECT * FROM tabela

zarznie Ci serwer.
thek
Bazy zazwyczaj posiadają dodatkowe informacje o ilości przechowywanych rekordów, nie powodujesz więc pierwszym bezpośrednio wykonania zapytania liczącego tylko odwołanie się do tabeli statystycznej, co jest o wiele szybsze. Poza tym jedziesz mocno po pamięci, która wynik zapytania musi gdzieś przechować do zwrócenia. Jak myślisz... Jedna wiersz o jednej kolumnie zajmuje dużo miejsca w porównaniu z wielowierszowym i wielokolumnowym wynikiem? smile.gif

To co podałes jako wynik jest już zapewne w cache'u bazy i zrobione jednokrotnie, a nie średnią z, powiedzmy, 10000 prób dla różnych wielkościowo i strukturalnie tabel. Im większe tym prościej to zauważyć.
Radek_1
A czy nie najszybszym w takim wypadku zapytaniem jest:

  1. SELECT COUNT(1) FROM tabela


Ma to jakieś znaczenie czy 1 czy *? Z tego co kojarzę, to dawno temu gdzieś tu na forum tak wyczytałem.
thek
Najlepiej robić count() na kolumnach które posiadają indeks założony. Czy będzie to pierwsza, druga czy którąs tam kolumna to już nieważne.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.