Gość Łukasz Tkacz Zgłoś post Napisano Marzec 17, 2008 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
alien 345 Zgłoś post Napisano Marzec 17, 2008 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
Gość Bartosz Gadzimski Zgłoś post Napisano Marzec 17, 2008 Co do obciążenie to gorąco zachęcam do korzystania z polecenia "explain" Udostępnij ten post Link to postu Udostępnij na innych stronach
Noone 19 Zgłoś post Napisano Marzec 17, 2008 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 Zgłoś post Napisano Marzec 19, 2008 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