Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zbyt duża ilość zapytań do bazy [MySQL][PHP]
kubax33
post
Post #1





Grupa: Zarejestrowani
Postów: 157
Pomógł: 1
Dołączył: 27.01.2010

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


Mam limit 30 zapytań do bazy. Aktualizuję w bazie ceny opisy itp. Wszystko wykonuje się w pętli dla około 15 tys pozycji. Poniżej zapytania, które generuje skrypt. Niestety za każdym razem serwer blokuje mi połączenie przy około 3 tysięcznej pozycji tracąc połączenie z bazą. Czy jest możliwość jakiegoś zoptymalizowania tych zapytań, aby skrypt nie obciążał tak bazy? Swoją drogą ciężko mi pojąć funkcjonowanie tych maksymalnych 30 zapytań do bazy, aby to omijać jakoś logicznie licząc.

  1. $ins1 = mysql_query("INSERT INTO aktualizacja (ean) VALUES('$ean13');");
  2. $ins2 = mysql_query("SELECT * FROM ps_product WHERE ean13=$ean13");
  3. $ins3 = mysql_query("UPDATE ps_product SET price=$price WHERE ean13=$ean13");
  4. $ins4 = mysql_query("SELECT * FROM ps_specific_price WHERE id_product='$rekord'");
  5. $ins5 = mysql_query("UPDATE ps_specific_price SET reduction='$reduction_brutto_end_2' WHERE id_product=$rekord ");
  6. $ins6 = mysql_query("UPDATE ps_product_shop SET price=$price WHERE id_product=$rekord");
  7. $ins7 = mysql_query("UPDATE ps_product_lang SET meta_title='$meta_title' WHERE id_product=$rekord");
  8. $ins8 = mysql_query("UPDATE ps_stock_available SET quantity='$active' WHERE id_product=$rekord");
Go to the top of the page
+Quote Post
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


30 zapytań ale co? na sekundę, minutę? a może 30 połączeń do BD... mało precyzyjne sformułowanie
Go to the top of the page
+Quote Post
Tomplus
post
Post #3





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


poczytaj o multi_query() ale działa tylko dla mySQLi, będziesz mógł w jednym zapytaniu wykonać wiele innych, dzięki czemu będziesz mógł zmniejszyć ilośc zapytań. Ja np. na stronie mojego sklepu wykonuje 13-16 zapytań.
Go to the top of the page
+Quote Post
bobek358
post
Post #4





Grupa: Zarejestrowani
Postów: 143
Pomógł: 22
Dołączył: 17.11.2007

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


To są tylko update czy jakieś selekty też?
Go to the top of the page
+Quote Post
kapslokk
post
Post #5





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


Cytat(Tomplus @ 23.11.2015, 22:03:14 ) *
poczytaj o multi_query() ale działa tylko dla mySQLi, będziesz mógł w jednym zapytaniu wykonać wiele innych, dzięki czemu będziesz mógł zmniejszyć ilośc zapytań. Ja np. na stronie mojego sklepu wykonuje 13-16 zapytań.

Jesli wysle je przez multi_query, to wcale nie zmniejszy ilosci zapytan, bo wysle ich tyle samo.
Go to the top of the page
+Quote Post
Tomplus
post
Post #6





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


Masz rację, ale nie sprecyzowałem, chodzi o ilość wywołań query.

Jeżeli masz takie limity są dwa rozwiązania:
- zmienić hosting
- stosowanie aktualizacji sekwencyjnej czyli wykonywanie aktualizacji co 2000 pozycji np. co 5 minut.

Ten post edytował Tomplus 24.11.2015, 09:00:26
Go to the top of the page
+Quote Post
kubax33
post
Post #7





Grupa: Zarejestrowani
Postów: 157
Pomógł: 1
Dołączył: 27.01.2010

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


faktycznie multi_query() daje chyba ten sam efekt. Co masz na myśli wspominając aktualizację sekwencyjną? nie chciałbym ręcznie tego robić tylko ewentualnie jakoś wprowadzić sekwencje przez skrypt. Myslałem też o
  1. sleep(10);
i nawet ją zastosowałem, aby np. przy 1000 2000 3000 produkcie skrypt się zatrzymał, ale co z tego jak np. przerwało mi na 2333. Nie wiem też jak sprawa wygląda jeśli chodzi o wstawanie takiego serwera MYSQL bo mam wykupiony prywatny serwer + oferta Performance 1 w OVH Ilość jednoczesnych połączeń do bazy 30 i nie wie czy to jest na sekundę czy jak ponieważ nie widze tego wskazania. Ustawiłem serwer mysql max_connections = 200. To też nic nie dało. Wskażcie co byście w tej sytuacji zrobili. Zmiana hostingu nie wchodzi w grę. Rozumiem, że jeśli wszystkie zapytania są mi potrzebne nie ma innej możliwości ograniczenia ich bo skrypt i tak musi się z bazą połączyć i pobrać to co potrzebuję tym bardziej, że wszystko jest w innych tabelach.

Cytat(bobek358 @ 24.11.2015, 08:28:00 ) *
To są tylko update czy jakieś selekty też?


2 selekty
Go to the top of the page
+Quote Post
bobek358
post
Post #8





Grupa: Zarejestrowani
Postów: 143
Pomógł: 22
Dołączył: 17.11.2007

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


No to jak są selekty to nie rób pętli tylko join i po sprawie.
Go to the top of the page
+Quote Post
kubax33
post
Post #9





Grupa: Zarejestrowani
Postów: 157
Pomógł: 1
Dołączył: 27.01.2010

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


Cytat(bobek358 @ 24.11.2015, 10:17:50 ) *
No to jak są selekty to nie rób pętli tylko join i po sprawie.


ok jak to zastosować jakiś przykład?
Go to the top of the page
+Quote Post
viking
post
Post #10





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Zawsze możesz coś takiego zrobić:

  1.  
  2. UPDATE t1
  3. INNER JOIN t2 ON t2.t1_id = t1.id
  4. INNER JOIN t3 ON t2.t3_id = t3.id
  5. SET t1.a = 'something',
  6. t2.b = 42,
  7. t3.c = t2.c
  8. WHERE t1.a = 'blah';

Nie wiem jak od strony wydajności ale chociaż ograniczy zapytania
Go to the top of the page
+Quote Post
bobek358
post
Post #11





Grupa: Zarejestrowani
Postów: 143
Pomógł: 22
Dołączył: 17.11.2007

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


Wklej tutaj cały kod to zobaczymy co tam masz.
Go to the top of the page
+Quote Post
DarkAbso
post
Post #12





Grupa: Zarejestrowani
Postów: 60
Pomógł: 10
Dołączył: 17.11.2011

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


@viking dobrze radzi, ewentualnie upchną bym wszystko w procedurze i ją wywołał, a następnie sprawdził czy mi to wpada na limit jako jedno wywołanie zapytania do bazy.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 13:24