Witaj na naszym forum!
Nie jesteś zalogowany. (Logowanie - Rejestracja)
Użytkownik: Pamiętaj mnie:
Hasło:
Załóż nowy temat
Powiedz "NIE!" zapytaniom z pętli.
Google
To jest wiadomość reklamowa.
Grupa: Goście
 
off-line hemicalyaction
Odczytana Wysłano: Czwartek 21:15 24.09.2009 #2
Administrator


Grupa: Administratorzy
Posty: 436
Reputacja: Klejnot w koronie
Ostrzeżenia: 0%

Rejestracja: Czwartek 20:42 03.07.2008
Zapraszamy do kolejnego artykułu. Tym razem piszemy o optymalizacji ilości zapytań w bazie (oczywiście na przykładzie xnovy :] )

Powiedz "NIE!" zapytaniom z pętli.


Większość z was robi 2 zapytania żeby wyciągnąć jakieś dane z bazy. Pierwsze zapytanie wyciąga np id graczy na podstawie jakiegoś warunku. Drugie zapytanie Wyciąga dane z innej tabeli na postawie danych z pierwszego zapytania. Do tego jeszcze dochodzi pętelka while() i jeżeli pierwsze zapytanie zwróci powiedzmy 200 wierszy, to drugie zapytanie wykona się 200 razy... W praktyce może to wyglądać tak (na przykładzie xnovy):

Kod
$query = doquery('SELECT id FROM {{table}} WHERE pros = 1', 'users', false);

while($row = mysql_fetch_array($query)){
$query2[] doquery('SELECT id FROM {{table}} WHERE id_owner = '.$row['id'], 'planets', true);
}


W ten sposób można zaj**** ekhm, zamulić bazę. O wiele lepszym rozwiązaniem będzie zrobienie zapytania z JOIN'em (w tym wypadku INNER JOIN, zainteresowanych innymi sposobami złączeń odsyłam tu: dev.mysql.com/doc/refman/5.0/en/join.html):

Kod
$query = doquery('SELECT p.id as id_planety FROM {{table}}planets p
INNER JOIN {{table}}users u ON p.id_owner = u.id WHERE u.pros = 1', '', false);
while($row = mysql_fetch_array($query)){
$query2[] = $row['id_planety'];
}

Tym sposobem machnęliśmy to jednym zapytaniem. JEDNYM w porównaniu z ilością zapytań w poprzednim przykładzie. W ten sposób niezależnie od ilości rekordów w bazie ZAWSZE zostanie wykonane tylko jedno zapytanie.

Tak gwoli ścisłości wytłumaczę jeszcze zapis typu {{table}}users.

Prototyp funkcji doquery() wygląda następująco:

Kod
doquery(string zapytanie, string suffix, bool fetch);

zapytanie -> wiadomo;
suffix -> czyli nazwa tabeli bez prefixu (jezeli mamy game_users to suffixem jest users);
fetch -> true/false (czy ma pobrać jeden wiersz z wyniku);

W zapytaniu możemy użyć tagu {{table}}, który jest zbudowany z prefixu i suffixu. W praktyce {{table}} ZAWSZE zawiera conajmniej prefix (najczęściej 'game_'), do którego doklejany jest suffix, czyli robione jest coś takiego:
Kod
$prefix.$suffix;

Co się stanie, jeżeli jako drugi parametr funkcji doquery() damy pusty string? Ano stanie się to, iż {{table}} będzie zawierało TYLKO prefix (w praktyce najczęściej 'game_'). Wiedząc to możemy "ręcznie" dokleić odpowiedni suffix wewnątrz zapytania tak, jak np ja to zrobiłem, czyli:
Kod
SELECT * FROM {{table}}users


Posiadając tą wiedzę możemy śmiało konstruować skomplikowane zapytania na kilku tabelkach naraz ;]

Mam nadzieje, że artykulik przyda się paru osobom.
Ostatnio zmieniano Poniedziałek 13:53 28.12.2009 przez kallosz. Razem zmieniano 2 razy.
 
Google
To jest wiadomość reklamowa.
Grupa: Goście
 
0 odpowiedzi
Załóż nowy temat
Ten temat nie jest oznaczony żadnymi tagami.
Ten temat czyta w sumie 1 użytkowników, w tym 0 botów, 1 gości, 0 zarejestrowanych i 0 ukrytych użytkowników.
tego tematu nie czyta żaden zalogowany użytkownik
Przejdź do:
Przejdź do nowego forum
 
xNova - Forum polskiego supportu - xnova-support.pl > Forum > Nowości
Powiedz "NIE!" zapytaniom z pętli.
Kontakt Wersja lekka
Wtorek 03:34 07.09.2010
[ 0.45089 s | 9 SQL`s ]
powered by Callisto © 2010 Unisolutions