Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL]Wielkość zapytania do bazy kontra ilość zapytań., kwestie wydajnościowe zadawanych pytań
elmozaur
post 21.05.2015, 11:59:52
Post #1





Grupa: Zarejestrowani
Postów: 518
Pomógł: 18
Dołączył: 21.07.2008

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Daimos
post 21.05.2015, 12:06:17
Post #2





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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

Ten post edytował Daimos 21.05.2015, 12:06:34


--------------------
scriptun.com. Startup z poradnikami do gier ttp.zone i ttpzone.pl
Go to the top of the page
+Quote Post
elmozaur
post 21.05.2015, 12:31:26
Post #3





Grupa: Zarejestrowani
Postów: 518
Pomógł: 18
Dołączył: 21.07.2008

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
goartur
post 21.05.2015, 13:29:02
Post #4





Grupa: Zarejestrowani
Postów: 233
Pomógł: 27
Dołączył: 19.10.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
elmozaur
post 21.05.2015, 13:36:17
Post #5





Grupa: Zarejestrowani
Postów: 518
Pomógł: 18
Dołączył: 21.07.2008

Ostrzeżenie: (0%)
-----


napisałeś "znaleźć" - nawet jesli zapytanie jest typu insert ?

Ten post edytował elmozaur 21.05.2015, 13:41:37
Go to the top of the page
+Quote Post
goartur
post 21.05.2015, 14:42:25
Post #6





Grupa: Zarejestrowani
Postów: 233
Pomógł: 27
Dołączył: 19.10.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
kreatiff
post 21.05.2015, 15:09:04
Post #7





Grupa: Zarejestrowani
Postów: 324
Pomógł: 105
Dołączył: 7.08.2012

Ostrzeżenie: (0%)
-----


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. }
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 12:40