Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Wielkość zapytania do bazy kontra ilość zapytań.
Forum PHP.pl > Forum > Przedszkole
elmozaur
Chciałbym się poradzić w następującej kwestii jakościowo/efektywnej:
mam tablice w php zawierająca 400 pozycji (klucz=>wartosc),
pętlą foreach przelatuje po tych pozycjach i przy każdej robię jeden INSERT do bazy,

wersja 1:
pobieram id powstałego rekordu i na jego podstawie robie w osobnej tabeli 20 innych INSERTów.
(pytania do bazy są małe ale jest ich dużo - 20 przy każdej iteracji) = 400 zapytań

wersja 2:
pobieram id powstałego rekordu i na jego podstawie składam jedno zapytanie INSERT do bazy.
(pytanie jest wprawdzie jedno, ale duże i za jednym razem wrzuca 20 pozycji) = 40 zapytań

Biorąc pod uwage, że dane do każdego wariantu to okolo 8 kolumn z INTami lub VARCHARami - czy lepiej zadawać bazie MySQL dużo małych czy mniej ale większych pytań questionmark.gif?
Daimos
to, że wyślesz jedno polecenie, w którym jest 400 zapytań, zrobi nie wielką różnicę, bo zapytań dalej jest tyle samo. Jeśli to nie jest jakiś developerski skrypt, to raczej musisz przemyśleć logikę tej aplikacji
elmozaur
Chyba źle napisalem. Może bardzo uproszczę moj problem:

wariant 1:
  1. for ($i=0;$i<20;$i++) {
  2. $sql = "INSERT INTO tab VALUES('','1','2','3','4','5','6','7','8','9','10')";
  3. $q = $db->prepare($sql);
  4. $q->execute();
  5. }


wariant 2:
  1. $sql = "INSERT INTO tab VALUES";
  2. for ($i=0;$i<20;$i++) {
  3. $sql .= "('','1','2','3','4','5','6','7','8','9','10'),";
  4. }
  5. $sql = substr($sql, 0, -1);
  6. $q = $db->prepare($sql);
  7. $q->execute();


Tak czy owak musze zrobić takie zapytanie - pytanie czy lepiej składać jedno duże zapytanie czy wysyłać kilkanaście mniejszych questionmark.gif?
goartur
Cytat(elmozaur @ 21.05.2015, 13:31:26 ) *
Chyba źle napisalem. Może bardzo uproszczę moj problem:

wariant 1:
  1. for ($i=0;$i<20;$i++) {
  2. $sql = "INSERT INTO tab VALUES('','1','2','3','4','5','6','7','8','9','10')";
  3. $q = $db->prepare($sql);
  4. $q->execute();
  5. }


wariant 2:
  1. $sql = "INSERT INTO tab VALUES";
  2. for ($i=0;$i<20;$i++) {
  3. $sql .= "('','1','2','3','4','5','6','7','8','9','10'),";
  4. }
  5. $sql = substr($sql, 0, -1);
  6. $q = $db->prepare($sql);
  7. $q->execute();


Tak czy owak musze zrobić takie zapytanie - pytanie czy lepiej składać jedno duże zapytanie czy wysyłać kilkanaście mniejszych questionmark.gif?

Oczywiscie lepiej wybrac wariant ktory ma mniejsze zapytanie, bazie o wiele latwiej znalesc informacje.
elmozaur
napisałeś "znaleźć" - nawet jesli zapytanie jest typu insert ?
goartur
Cytat(elmozaur @ 21.05.2015, 14:36:17 ) *
napisałeś "znaleźć" - nawet jesli zapytanie jest typu insert ?

Nie, insert dodaje, nie sprawdza rekordow, wiec wiadomo ze nie uzywa zbyt duzej mocy do tej operacji.
Duze zapytania mozesz uzywac ale nie jak masz po pare tysiecy rekordow, im wiecej rekordow tym dluzej trwa filtracja.
kreatiff
Kiedyś zdaje się pytałem o coś podobnego. Nie ma jednoznacznej odpowiedzi. To jest kwestia optymalizacyjna, trzeba przetestować. Ale u mnie różnice były pomijalne, i bardziej opłacało się zachować czytelność zapytań, niż brnąć w jedno czy kilka wielkich.

Tak na marginesie dodam, że samo zapytanie z pytajnikami czy zmiennymi oraz prepare() robimy przed pętlą, a w samej pętli już tylko bindujemy dane i wykonujemy zapytanie:
  1. $q = "INSERT INTO tab VALUES ?";
  2. $q = $db->prepare($q);
  3. for ($i=0;$i<20;$i++) {
  4. $q->bindValue(...);
  5. $q->execute();
  6. // albo zamiast powyższych 2 linijek $q->execute(array(...));
  7. }
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.