![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 283 Pomógł: 11 Dołączył: 9.07.2010 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Witam!
Mam kod, który działa tak jak miał działać - tj. wykonuje wszystkie czynności jakie ma robić. Niestety obciąża mi serwer dosyć znacznie i spowalnia strony. Z indeksu przeniosłem go do jednej z podstron i trochę się poprawiło ale ta podstrona teraz działa wolno. Oto kod:
Dałoby się to jakoś zoptymalizować lub zrobić żeby robiło się np. raz na 10 minut, a nie z każdym wczytaniem strony? |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 1 707 Pomógł: 266 Dołączył: 3.07.2012 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Co ten kod robi dokładnie? Nie jest na tyle czytelny, żeby chciało mi się go analizować.
Jeśli chodzi o optymalizację, to upewnij się, że pole `status` ma typ ENUM (a nie VARCHAR) i że masz indeks na polu `nazwa`. Domyślam się, że masz dużo rekordów w tej tabeli. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 283 Pomógł: 11 Dołączył: 9.07.2010 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
W tabeli test_sites jest obecnie 24000 rekordów (liczba ta rośnie dosyć szybko) - zmieniłem już na enum dziękuję za radę.
W tabeli test_site jest 1400 rekordów - indeksu nie mogę dodać bo mam pole ID, które ma autoinkrementacje i mi wywala błąd Kod zarządza kategoriami stron dodanych do mojej strony. Sprawdza czy został zapełniony limit użytkowników którzy się zapisali stąd:
nazwa to ilość zapisanych / limits to liczba określona przez nas Jeśli liczby się wyrównają to strona jest przenoszona do innej kategorii:
Ten post edytował boro11 31.10.2013, 23:02:16 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 1 707 Pomógł: 266 Dołączył: 3.07.2012 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Chodzi o indeks, a nie klucz podstawowy. Indeksy znacznie przyśpieszają wyszukiwanie po danym polu. ZNACZNIE!
![]() |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 283 Pomógł: 11 Dołączył: 9.07.2010 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Okej ustawiłem indeks i rzeczywiście jest już szybciej o całe 4 sekundy, ale nadal trwa to długo bo ~3 sekund, nawet trochę więcej.
Opisałe kod w poście wyżej ![]() Edit: Czy dodanie tego indeksu do pola status pomoże? Ten post edytował boro11 1.11.2013, 02:24:16 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 1 Dołączył: 5.11.2013 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Jeśli nie jest dla ciebie problemem, żeby ta tablica była generowana raz na 10 minut, to zrób skrypt, który wygeneruje ci taką tablicę i zapisze w pliku i ustaw w CRONie żeby skrypt był uruchamiany co 10 minut. Nie będziesz użytkownika obciążał skomplikowanymi algorytmami.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 2 Dołączył: 1.02.2010 Ostrzeżenie: (0%) ![]() ![]() |
Robisz kilka pętli i w nich zapytania. Jeżeli masz bardzo dużo rekordów to robisz masakrycznie dużo updatów. Musisz to przepisać w sql i robić update za jednym zamachem wszystkiego bo inaczej nie ma szans na szybkie działanie.
Zrób echo wszystkich zapytań to będzie lepiej widać jak można to napisać. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
skoro update robisz w pętli i jest on zależny od zewnętrznego zapytania to wystarczyło by, gdybyś ten update robił w jednej transakcji na całą pętlę, poczytaj o tym...
oprócz tego pierwszą pętlę z UPDATE możesz załatwić w jednym zapytaniu gdyż zmienia się tylko warunek WHERE a reszta jest statyczna SQL IN Operator drugi update to już raczej trzeba zacząć transakcję przed pętlą i zakończyć za pętlą... choć jeszcze to Ci się nie przyda, ale np. ja problem z aktualizacją wielu danych z plików XML (sporych więc parsowałem te pliki nie przez DOM a SAX) gdzie czasami trzeba było dodać nowe rekordy rozwiązałem w ten sposób, iż tworzyłem tabelę tymczasową identyczną i w transakcji robiłem insert, po czym zapytanie gdzie id się powtarzało (nie mam tam autoinkrementacji - można to dać też na inne unikalne rekordy) robiłem jednym zapytaniem UPDATE from SELECT , kolejnym insert from select, a kolejnym usuwałem tabelę tymczasową... -------------------- Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 13:43 |