php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 04.12.2008, 14:49  
Neuer Benutzer
 
Registriert seit: 04.12.2008
Beiträge: 2
stephan_m befindet sich auf einem aufstrebenden Ast
Standard Zu lange Laufzeiten (SQL / Schleifen)

Hallo liebe Forengemeinde,
ich habe ein Script erstellt, das die Ergebnisse aus einer Datenbank mit Bowlingeinzelergebnissen (ca.16000) grafisch auswerten soll.
Zu diesem Zweck läuft das Script in einer Schleife über alle infragekommenden Spieler. In dieser Schleife wiederum läuft eine weitere Schleife über jeden Tag des Abfragezeitraumes und führt diverse Mysql Selects aus und füllt jeweils ein Array.
Die Laufzeit ist bei einem halben Jahr bereits be ca.50 Sekunden. Ich habe jedoch Daten aus bis jetzt 8 Jahren in der DB.

Jetzt würde ich mich freuen, wenn mir jemand bei der deutlichen Verkürzung der Laufzeit helfen könnte.

Vielen Dank,
Stephan

Hier der Code (ist leider etwas länger):
PHP-Code:
$datax = array();
$data = array();
$color = array("white","red","green","blue","black","orange","pink","brown","purple","lightskyblue","lightgreen",
               
"lightred","darkblue","darkgreen","darkred","aquamarine","blueviolet","bisque","cornflowerblue",
               
"deeppink","darkgoldenrod","salmon1","wheat1","magenta","navy","mediumpurple","olivedrab4","orangered2",
               
"palegreen3","snow3","springgreen","skyblue","plum3","yellowgreen","tan","tan1","turquoise","turquoise4",
               
"olivedrab2");
$linie = array();
$von_stamp sql2stamp($von_datum);
$bis_stamp sql2stamp($bis_datum);
$sql_neu=$sql;

// Grafik anlegen
$graph = new Graph(800,600,"auto");    
$graph->SetScale("datlin");
$graph->img->SetMargin(50,90,40,50);

    
$sqlbef=  "SELECT DISTINCT bow_spiele.passnr as passnr, bow_spieler.name as nname, bow_spieler.vorname as vname
               FROM bow_spiele, bow_spieler, bow_wettkampf, bow_orte"
.$sql_tab5."
               WHERE bow_spieler.passnr = bow_spiele.passnr
               AND bow_wettkampf.nr = bow_spiele.wettkampf
               AND bow_orte.nr = bow_spiele.ort
               AND bow_spiele.datum >= '"
.$von_datum."'
               AND bow_spiele.datum <= '"
.$bis_datum."'
               AND "
.$sql_neu." ".$sql_group1;
$result mysql_query($sqlbef,$link);
if (
$einzel == 1)
  {
//***************************************************************************************************
// Schleife über alle Spieler
//***************************************************************************************************
  
while ($spieler mysql_fetch_array($result))
    { 
//Anfang Spieler-Schleife
    
$sql_neu "bow_spiele.passnr = ".$spieler[passnr]." AND ".$sql;
  
$erst_wert 0;
  
$u 0;
//Farbenzaehler
  
$r++;

//***************************************************************************************************
// Schleife über alle Tage
//***************************************************************************************************
  
for ($i $von_stamp$i <= $bis_stamp ;$i $i+86400)
    {
// Tageszaehler
    
$u++;

// Soll die Schnittentwicklung oder der -verlauf ermittelt werden?
    
if ($entwicklung == 0)
      {
      
$k"=";
      
$l"verlauf";
      }
    else
      {
      
$k ">= ".$von_datum." AND bow_spiele.datum <= ";
      
$l"entwicklung";
      }

// Prüfen, ob der Wert des Tages leer ist (kein Ergebnis an diesem Tag)

    
$sqlbef2=  "SELECT max(bow_spiele.datum) as datum
               FROM bow_spiele, bow_spieler, bow_wettkampf, bow_orte"
.$sql_tab5."
               WHERE bow_spieler.passnr = bow_spiele.passnr
               AND bow_wettkampf.nr = bow_spiele.wettkampf
               AND bow_orte.nr = bow_spiele.ort
               AND bow_spiele.datum = '"
.date("Y-m-d",$i)."' 
               AND "
.$sql_neu." ".$sql_group1;

    
$result2 mysql_query($sqlbef2,$link);
    
$akt_erg mysql_result($result2,0"datum");

    if (
$akt_erg == '')
      {
      if(
$erst_wert != 0)
        {
        
$schnitt '-';
        
$data[]=$schnitt;
        }
      else
        {
        
$data[] = "";
        }
      }
    else
      {
      
$sqlbef1=  "SELECT max(bow_spiele.passnr) as passnr, max(bow_spieler.name) as nname, max(bow_spieler.vorname) as vname, max(bow_spiele.datum) as datum, sum(bow_spiele.wert) as wert, count(bow_spiele.wert) as anzahl
          FROM bow_spiele, bow_spieler, bow_wettkampf, bow_orte"
.$sql_tab5."
          WHERE bow_spieler.passnr = bow_spiele.passnr
          AND bow_wettkampf.nr = bow_spiele.wettkampf
          AND bow_orte.nr = bow_spiele.ort
          AND bow_spiele.datum "
.$k." '".date("Y-m-d",$i)."' 
          AND "
.$sql_neu." ".$sql_group1;
      
$result1=mysql_query($sqlbef1,$link);
      
$row mysql_fetch_array($result1);
      
$erst_wert 1;
      
$schnitt $row["wert"]/ $row["anzahl"];
      
$data[]=($schnitt);
      }

// Nur beim jeweils ersten Tag wird der Name ermittelt

    
if ($u == 1)
      {
      
$name_kompl =$row["vname"]." ".$row["nname"];
      }

// Nur beim ersten Spieler werden die Werte für die X-Achse aufgenommen
    
if ($r==1)
      {
      if (
$i == 0)
        {
        
$datax[] = date("d.m.Y",$bis_stamp);
        }
      else
        {
        
$datax[] = date("d.m.Y",$i);
        }
      }
    }
       
//Zeichnen der Linie
    
if ($u 500)
      {
      
$w 2;
      }
    else
      {
      
$w 3;
      }

    
$lineplot=new LinePlot($data);
    
$lineplot->SetLegend($name_kompl);
    
$lineplot->SetColor($color[$r]);
    
$lineplot->mark->SetType(MARK_FILLEDCIRCLE);
    
$lineplot->mark->SetFillColor($color[$r]);
    
$lineplot->mark->SetColor($color[$r]);
    
$lineplot->mark->SetWidth($w);

// Hinzufügen der Linien zur Grafik
    
$graph->Add($lineplot);
    
$data=array();
    
$datax2 = array();
    } 
//Ende Spieler-Schleife
  

stephan_m ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 04.12.2008, 22:21  
Erfahrener Benutzer
 
Registriert seit: 27.09.2008
Beiträge: 316
PHP-Kenntnisse:
Fortgeschritten
moveax1 befindet sich auf einem aufstrebenden Ast
Standard

Muss die Berechnung wirklich bei jedem Scriptaufruf stattfinden, oder kannst du das ganze zB einmal täglich aktualisieren und in eine extra Datei speichern?

Wenn ja dann leite die Ausgabe doch in eine Datei um und lass diese täglich über einen CronJob oder ähnliches aktualisieren.
moveax1 ist offline  
Alt 04.12.2008, 22:54  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

interessant wären da noch die datenbankstrucktur sowie einige vergleichsdaten.

fang mit dem debuggen bei den queries an. lass dir jeden query ausgeben und führe ihn mit explain aus (ergebnis hier posten SAMT strucktur der tabelle(n)) . dann aktiviere profiling (geht mit phpmyadmin auch, einfach unter dem ausgeführten query der ja wieder angezeigt wird "messen" checkbox aktivieren) und führe den query nocheinmal aus (ergebnis wieder posten).
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline  
Alt 04.12.2008, 23:30  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.988
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Vor allem führe keine Queries in Schleifen aus.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online  
Alt 05.12.2008, 08:07  
Neuer Benutzer
 
Registriert seit: 04.12.2008
Beiträge: 2
stephan_m befindet sich auf einem aufstrebenden Ast
Standard

Vielen Dank für die vielen Vorschläge,
da habe ich ja einiges auszuprobieren.
Ich melde mich, wenn ich Erfolge aufzuweisen habe
stephan_m ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
schleifen problem amsele1986 PHP Tipps 2008 3 21.06.2008 17:45
Problem mit Schleifen danysahne333 PHP Tipps 2006 2 11.09.2006 11:17
Schleifen buffern Simon9990 PHP Tipps 2006 6 03.04.2006 18:56
2 verschachtelte while Schleifen. Großes Performanceproblem Datenbanken 3 30.05.2005 12:52
While Schleifen Problem PHP Tipps 2005 9 22.05.2005 22:35
problem mit schleifen PHP Tipps 2005 11 23.04.2005 14:59
While Schleifen PHP Tipps 2005 9 22.04.2005 13:04
3 Variablen aus 3 Schleifen in ein INSERT ? PHP Tipps 2005 13 03.02.2005 17:33
schleifen problem nautiluS PHP Tipps 2004-2 6 22.12.2004 13:23
Templateklasse für Schleifen umschreiben Neo2k3 PHP Tipps 2004-2 12 17.12.2004 15:37
Schleifen Stinger PHP Tipps 2004 1 26.10.2004 02:42
while schleifen ($dsatz=mysql_fetch_assoc($abfrage1) stefan-miti PHP Tipps 2004 5 23.09.2004 20:46
variablen verküpfen bei schleifen nautiluS PHP Tipps 2004 12 16.08.2004 14:05
Templatesystem: Wie realisiere ich Schleifen? TheSkaterFriend PHP Tipps 2004 2 14.08.2004 15:19
[Erledigt] Schleifen Problem :( PHP Tipps 2004 1 27.07.2004 17:26

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
laufzeiten beim schleifen, php laufzeiten, php sql2stamp, sql schleife für arrays

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:38 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum