Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL] zliczenie wierszy w dwóch tabelach
Forum PHP.pl > Forum > Przedszkole
peter13135
  1. SELECT portal_posts.COUNT(id) AS count_posts, portal_topics.COUNT(id) AS count_topics FROM portal_posts, portal_topics


chyba można sie domyśleć co chcę osiągnąć, proszę o poprawne zapytanie
peter13135
hmm, jakoś wolno mi to działa

bez tych wszystkich zapytań czas generowania strony wynosi średnio 0.045s
gdy dodam do skryptu to zapytanie - czas generowania wynosi około 0.8s

wynik zapytania jest taki

count_posts count_users count_topics
45003 11 5

  1. SELECT COUNT( DISTINCT portal_posts.id ) AS count_posts, COUNT( DISTINCT portal_users.id ) AS count_users, COUNT( DISTINCT portal_topics.id ) AS count_topics
  2. FROM portal_posts, portal_users, portal_topics


gdy trochę uszczuplę to zapytanie do takiej postaci
  1. SELECT
  2. COUNT(DISTINCT portal_posts.id) AS count_posts,
  3. COUNT(DISTINCT portal_topics.id) AS count_topics FROM portal_posts, portal_topics"


to czas generowania strony wynosi 0.2s

czyli sporo lepiej, jednak dlaczego i tak za dużo jak na tabele z 11 wierszami, czym to jest spowodowane questionmark.gif

edit:// zapytanie typu

  1. SELECT COUNT(id) FROM portal_users


(bez wyraźnej róznicy z której tabeli pobieram dane) "spowalnia" stronę do 0.055, czyli niewiele w porównaniu do tych powyższych wyników, moim zdaniem lepiej by było zrobić 3 osobne zapytania, skoro działają one znacznie szybciej, jednak ten fakt wydaje mi się dziwny

nikt nie pomoże ?
alegorn
3 osobne pytania? nie...
to tylko na localhoscie ci sie szybciej wykona niz na obciazanym serwerze...
optymalizuj ilosc zapytan - bo moze sie okazac ze zapychasz serwer ich sama iloscia...

pozakladaj indexy odpowiednie, sprawdz EXPLAIN ..

poza tym, o ile dobrze mysle to to jest o kilka poziomow nieba bardziej optymalne:

  1. SELECT
  2. (SELECT COUNT(portal_posts.id) FROM portal_posts) AS count_posts,
  3. (SELECT COUNT(portal_users.id) FROM portal_users) AS count_users,
  4. (SELECT COUNT( DISTINCT portal_topics.id ) FROM portal_topics) AS count_topics


od:
  1. SELECT COUNT( DISTINCT portal_posts.id ) AS count_posts, COUNT( DISTINCT portal_users.id ) AS count_users, COUNT( DISTINCT portal_topics.id ) AS count_topics
  2. FROM portal_posts, portal_users, portal_topics


w tym drugim zapytaniu robisz bezsensowne polaczenia miedzy tabelami... i to do tego w iloczynie kartezjanskim czyli:
query = count( a ) * count( b ) * count( c ), a pozniej zliczasz unikaty w query... jesli masz nawet po 10 rekordow w tabelach to query wylicza juz 1000 rekordow... i jak tu sie dziwic ze spowalnia...? :]
za cos takiego, na duzych tabelach kazdy admin cie powiesi :]
peter13135
cóż... taki sposób znalazłem na na stronie do której link otrzymałem od webber'a
więc go użyłem, do tej pory nigdy nie łączyłem tabel.. nawet nie używałem funkcji count() w mysql, więc zwyczajnie niemam pojęcia jak sie tym posługiwać, i co jest optymalne
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.