Skocz do zawartości
Zaloguj się, aby obserwować  
Gość Łukasz Tkacz

[PHP+MYSQL] Ilość a objętość zapytań

Polecane posty

Gość Łukasz Tkacz

Witam,

nurtuje mnie pewne pytanie - która sytuacja mniej obciąża serwer:

 

1) Skrypt wykonuje 2-3 zapytania do bazy, w każde to SELECT które pobiera nieco informacji ale w większości bardzo krótkich i np. liczbowych

 

2) Skrypt wykonuje 1 zapytanie ale pobiera to co wyżej + sporo treści np. news czy duży artykuł.

 

Chcę sobie zorbić cachowanie treści newsow i artykułów w php-fusion i nie wiem czy to ma sens.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ciezko ocenic czym dokladnie jest "news" czy "duzy artykul" i o ile bardziej zlozona jest sytuacja z pkt 2 w stosunku do pkt 1. Dlatego napisze co do zasady.

 

Generalnie powinno sie wyciagac dane zwiazane ze soba 1 selectem za pomoca zlaczen (joiny). Wprawdzie join pochlania nieco zasobow, ale jest to i tak korzystniejsze niz wykonywanie 3 selectow de facto o te same dane. Ponadto otrzymujemy wieksza spojnosc danych. Oszczednosc otrzymujemy precyzyjnie definiujac zwracane atrybuty (kolumny) zamiast projekcji wszystkiego (podawania gwiazdki), gdy nie jest to konieczne. Jeszcze wieksza oszczednosc uzyskujemy indeksujac klucze obce (co w normalnej bazie danych jest oczywiste, ale w przypadku MySQL/MyISAM juz tak oczywiste nie jest ;-) - raczej warto tworzyc bazy MySQL w mechanizmie InnoDB, chyba, ze to naprawde bardzo proste struktury).

 

Inaczej mowiac - (prawie) zawsze lepiej pobierac te same dane jednym zapytanie niz kilkoma rozbitymi. Z roznych przyczyn, jedna z nich jest wydajnosc.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Zależy jaką masz oglądalność ale cache'owanie zawsze ma sens (o ile z głową zrobione). Zależy też jak twoje zapytania wyglądają. Więcej danych do pobrania to oczywiście więcej ramu zużyte. osobiście wszelkiego rodzaju newsy cachuję z automatu.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość Łukasz Tkacz

Oryginalne zapytanie dotyczące newsów:

 

		$result = dbquery(
		"SELECT tn.*, tc.*, user_id, user_name FROM ".$db_prefix."news tn
		LEFT JOIN ".$db_prefix."users tu ON tn.news_name=tu.user_id
		LEFT JOIN ".$db_prefix."news_cats tc ON tn.news_cat=tc.news_cat_id
		WHERE ".groupaccess('news_visibility')." AND (news_start='0'||news_start<=".time().") AND (news_end='0'||news_end>=".time().")
		ORDER BY news_sticky DESC, news_datestamp DESC LIMIT $rowstart,$items_per_page"
	);

 

zapytanie które dałem do wykonania po usunięciu pobierania treści newsa, zostawiłem tylko te elementy ktore naprawdę są potrzebne:

 

		$result = dbquery("SELECT c.news_cat_id, c.news_cat_image, n.news_news, n.news_breaks, n.news_id, n.news_start, n.news_end, n.news_visibility, n.news_sticky, n.news_allow_ratings, n.news_allow_comments, u.user_id, n.news_subject, n.news_datestamp, n.news_extended, n.news_reads FROM ".$db_prefix."news as n, ".$db_prefix."news_cats as c, ".$db_prefix."users as u WHERE u.user_id=n.news_name AND n.news_cat=c.news_cat_id AND ".groupaccess('news_visibility')." AND (news_start='0'||news_start<=".time().") 
AND (news_end='0'||news_end>=".time().") ORDER BY news_sticky DESC, news_datestamp DESC LIMIT $rowstart,$items_per_page");

 

Tak zrobione bo nie potrafię się za bardzo posługiwać JOIN.

 

Treść newsa byłaby odczytywana z cache, jeżeli natomiast:

 

a ) ktoś wchodzi na stronę a pliku treści newsa nie ma w cache - dane są poberane z bazy, tworzony jest plik cache.

 

B ) administrator edytuje newsa i zapisuje zmiany - dane w bazie są aktualizowane, stary plik cache jest zastępowany przez nowy.

 

W wypadku najnowszych newsów wykonywane byłoby tylko 1 zapytanie (przy ich utworzeniu przez administratora, przy oglądaniu dane byłyby już wyciągane z cache).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

Zaloguj się, aby obserwować  

×