Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z optymalizacją tabeli.
patrykt
post 6.12.2006, 11:45:53
Post #1





Grupa: Zarejestrowani
Postów: 101
Pomógł: 0
Dołączył: 3.12.2005

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


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. ?>
Go to the top of the page
+Quote Post
mysz
post 6.12.2006, 13:41:25
Post #2





Grupa: Zarejestrowani
Postów: 81
Pomógł: 0
Dołączył: 26.08.2006
Skąd: Szczecin

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


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 :)


--------------------
urzenia.net
Go to the top of the page
+Quote Post
patrykt
post 7.12.2006, 11:34:26
Post #3





Grupa: Zarejestrowani
Postów: 101
Pomógł: 0
Dołączył: 3.12.2005

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


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)?
Go to the top of the page
+Quote Post
mysz
post 7.12.2006, 15:18:31
Post #4





Grupa: Zarejestrowani
Postów: 81
Pomógł: 0
Dołączył: 26.08.2006
Skąd: Szczecin

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


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 :)

Ten post edytował mysz 7.12.2006, 15:19:10


--------------------
urzenia.net
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: 16.06.2025 - 21:14