|
Witaj na naszym forum!
Nie jesteś zalogowany. (Logowanie - Rejestracja) |
![]() |
|
Google
|
To jest wiadomość reklamowa. | ||
|
Grupa: Goście
|
|
||
|
|||
|
|||
|
Administrator
![]() ![]() ![]() Grupa: Administratorzy Posty: 436 Reputacja: Klejnot w koronie Ostrzeżenia: ![]() 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
|
|
||
|
|||
![]() |
| Przejdź do: |
  |
| Kontakt | Wersja lekka | Wtorek 03:34 07.09.2010 |
![]() |