Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Kwestia optymalizacji zapytań
Maciek_#_&
post
Post #1





Grupa: Zarejestrowani
Postów: 149
Pomógł: 1
Dołączył: 22.02.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Nh2003
post
Post #2





Grupa: Zarejestrowani
Postów: 81
Pomógł: 14
Dołączył: 3.10.2007

Ostrzeżenie: (0%)
-----


Zdecydowanie powinienes uzyc
  1. SELECT COUNT(*) FROM tabela


Przy wiekszej ilosci danych wykonanie
  1. SELECT * FROM tabela

zarznie Ci serwer.
Go to the top of the page
+Quote Post
thek
post
Post #3





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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ć.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Radek_1
post
Post #4





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 9.09.2003
Skąd: Bełchatów

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Radek_1 11.10.2011, 15:22:20
Go to the top of the page
+Quote Post
thek
post
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 08:20