Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z optymalizacją tabeli.
Forum PHP.pl > Forum > Bazy danych > MySQL
patrykt
witam. optymalizuje 60 000 rekordów w tabeli ale trwa to koszmaaaaarnie wolno.
zerkniecie gdzie kod jest walnięty, że tak długo to trwa?

poniższy kot zapętlam kilka razy a dokument odświeżam sobie z ajaxa.

  1. <?
  2.  
  3. $r = mysql_query("SELECT * FROM pozycjonowanie_log WHERE odc='' LIMIT 1") or die(mysql_error());
  4. $p = mysql_fetch_array($r);
  5.  
  6. $pocz_dnia = mktime(0,0,0,date("m",$p['data']),date("d",$p['data']),date("Y",$p['data']));
  7. $kon_dnia = mktime(0,0,0,date("m",$p['data']),date("d",$p['data'])+1,date("Y",$p['data']));;
  8.  
  9. $r1 = mysql_query("SELECT MAX(id) AS id FROM pozycjonowanie_log WHERE data>=".$pocz_dnia." AND data<".$kon_dnia." AND slowo='".$p['slowo']."' AND odc=''") or die('m '.mysql_error());
  10. $p1 = mysql_fetch_array($r1);
  11. $r2 = mysql_query("DELETE FROM pozycjonowanie_log WHERE data>=".$pocz_dnia." AND data<".$kon_dnia." AND slowo='".$p['slowo']."' AND odc='' AND id!=".$p1['id']) or die(mysql_error());
  12. $r3 = mysql_query("UPDATE pozycjonowanie_log SET odc=".time()." WHERE id=".$p1['id']) or die(mysql_error());
  13.  
  14. ?>
mysz
Zacznij od wyciągnięcia pierwszego selecta ($r) poza Twoje zapętlenie, i wywal z niego limita. I wtedy dopiero wrzuć to w pętlę.
Nie wywołuj tyle razy date() i time() - to funkcje odwołujące się do systemu, więc i dużo zajmuje ich wywołanie. Pobierz sobie potrzebne Ci dane raz i zmiennych, i używaj ich. Poniżej w liniach 6 i 7 masz 6 wywałań date(), a może być tylko 1.
Zamiast 'data>=".$pocz_dnia." AND data<".$kon_dnia."' użyj BETWEEN.
Nie wiem jak to wygląda w innych częściach systemu, ale jeśli dasz radę to spróbuj sobie gdzieś keszować warotść MAX(id) i nie pobierać tego za każdym razem - żeby znaleźć tą wartość MySQL za każdym razem sprawdza wszystkie rekordy w bazie.

To tak na pierwszy rzut oka, może jeszcze ktoś coś dopowie ciekawego :)
patrykt
dzięki za rady. zastosowałem niemal wszystkie, niektóre faktycznie trafne. o ile time mogłem przenieść poza pętlę to już date się nie da smile.gif

może jest szybszy sposób od MAX(id)?
mysz
Nie mówiłem nic o wyjmowaniu date() z pętli. Mówiłem o jego jednokrotnym wywołaniu.

Zamiast
  1. <?php
  2. date("m",$p['data']),date("d",$p['data']),date("Y",$p['data'])
  3. ?>

zrób
  1. <?php
  2. $date = explode('-', date('m-d-Y', $p));
  3. ?>

i później podstawiaj tylko
  1. <?php
  2. $date[0]
  3. ?>


Tylko kurczę, jak teraz na to patrzę, to mam wrażenie że robisz dokładnie to samo 2 razy. Zdaje się że w polu 'data' tabeli 'pozycjonowanie_log' masz timestampa, którego używasz w date do pobrania danych typu rok etc, żeby z tych danych uzyskać... timestampa?

Co do MAX(id) - tutaj jest nieco więcej zmian.
Chodzi o to, żebyś przy każdym insert-cie zapisywał sobie w jakimś polu najnowszą wartość ID. Musisz tylko pamiętaćo uaktualnianiu tego pola przy każdym insercie.
Dzięki temu unikniesz wywołania MAX(), ponierając tylko pojedynczą wartość tego pola...

Nie wiem tylk oczy da się to u Ciebie w dokładnie taki sposób wykonać, nie znam systemu, ani nie mam czasu się nad tym zanadto zastanawiać, to było tylko to co mi się rzuciło w oczy patrząc na Twój kod.

Ojoj, chyba coś spi*** w kodzie forum, bo się fajnie cudzysłowia eskejpują... :)
EDIT: a, to tylko przy podglądzie :)
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.