Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zbyt duża ilość zapytań do bazy [MySQL][PHP]
Forum PHP.pl > Forum > Przedszkole
kubax33
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");
Pyton_000
30 zapytań ale co? na sekundę, minutę? a może 30 połączeń do BD... mało precyzyjne sformułowanie
Tomplus
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ń.
bobek358
To są tylko update czy jakieś selekty też?
kapslokk
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.
Tomplus
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.
kubax33
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
bobek358
No to jak są selekty to nie rób pętli tylko join i po sprawie.
kubax33
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?
viking
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
bobek358
Wklej tutaj cały kod to zobaczymy co tam masz.
DarkAbso
@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.
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.