php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 17.11.2008, 16:35  
Erfahrener Benutzer
 
Registriert seit: 02.03.2008
Beiträge: 351
robydog befindet sich auf einem aufstrebenden Ast
Standard Performance mit 64000 Einträgen

Hallo zusammen

hab da ein kleiners Problem und zwahr hab ich in einer DB momentan 64000 Einträge und die Performance beim aufrufen der Seite ist sau langsam geworden. Dies hatte ich mit der hälfte noch nicht.

Könnt ihr mir sagen ob ich da was an programmierung falsch gemacht hab?

Hier mal der Code der Seite

PHP-Code:
<?php 
include 'settings/database.php';
$CategoryName$_GET["CategoryName"];

$name$_GET["name"];
$sql "SELECT * FROM shop WHERE name = '$name' ";
        
$ergebnis mysql_query($sql);
        while(
$row mysql_fetch_object($ergebnis))
        {
        
$name_header $row->name;
        
$description_header $row->description;
        }

    include 
"../templates/Sphider-plus/header-shop.html";    

?>


<h1 align="center"><br>
</h1>
<table width="1000" border="0" align="center" cellpadding="0" cellspacing="2">
  <tr>
    <td valign="top"><?php




if ($CategoryName == "")
        {
        
$sql="SELECT TDCategoryName FROM shop ORDER BY TDCategoryName";
      
$ergebnis mysql_query($sql);
      
$alter_artikel null;
while(
$row mysql_fetch_object($ergebnis)) {
    if (
$row->TDCategoryName != $alter_artikel){

        echo 
'<a href="?CategoryName='$row->TDCategoryName .'&TDCategoryName=1">'$row->TDCategoryName .'</a><br>';
        
$alter_artikel $row->TDCategoryName;
    }
}  
?>
</td>
    <td width="800" valign="top">
    <div align="center">
      <form name="form1" method="post" action="search.php">
        <label></label>
      </form>
    </div></td>
  </tr>
</table>
<?php
        
}
        else
        {


$CategoryName$_GET["CategoryName"];

$sql="SELECT TDCategoryName FROM shop ORDER BY TDCategoryName";
      
$ergebnis mysql_query($sql);
      
$alter_artikel null;
while(
$row mysql_fetch_object($ergebnis)) {
    if (
$row->TDCategoryName != $alter_artikel){

        echo 
'<a href="?CategoryName='$row->TDCategoryName .'&TDCategoryName=1">'$row->TDCategoryName .'</a><br>';
        
$alter_artikel $row->TDCategoryName;
    }
}  
?>
</td>
    <td width="800" valign="top">
<?php
$CategoryName
$_GET["CategoryName"];

{ echo
'
        <strong><table width="800" border="0" cellspacing="0" cellpadding="0" class="admin_anzeigen">
  <tr>
    <td width="130" ><strong>Produkt</strong></td>
    <td width="100" align="center" valign="middle"><strong>Produktbild</strong></td>
    <td width="90" align="center"><strong>Preis</strong></td>
    <td width="90" align="center"><strong>Shop</strong></td>
     <td width="90" align="center"><strong>Detail</strong></td>
  </tr>
</table></strong>'
;
      
$TDCategoryName$_GET["TDCategoryName"];

        if(!isset(
$TDCategoryName))
           {
           
$TDCategoryName 1;
           }

        
$eintraege_pro_seite 10;

        
$start $TDCategoryName $eintraege_pro_seite $eintraege_pro_seite;

        
$sql "SELECT name,imageUrl,price,currency,programName FROM shop WHERE TDCategoryName = '$CategoryName' ORDER BY TDCategoryName LIMIT $start, $eintraege_pro_seite";
        
$ergebnis mysql_query($sql);
        
$i=1;
        while(
$row mysql_fetch_object($ergebnis))
           {
           
$color = ($i 2) ? "#FFFFFF" "#CCCCCC";
           echo 
'
        <table width="800" border="0" cellspacing="0" cellpadding="0" class="admin_anzeigen">
  <tr>
    <td width="130" bgcolor='
.$color.'>'.$row->name.'</td>
    <td width="100" align="center" valign="middle" bgcolor='
.$color.'><img src='.$row->imageUrl.' width="100"></td>
    <td width="90" align="center" bgcolor='
.$color.'>'.$row->price.' '.$row->currency.'</td>
    <td width="90" align="center"bgcolor='
.$color.'>'.$row->programName.'</td>
     <td width="90" align="center"bgcolor='
.$color.'><a href="product_detail.php?name='.$row->name.'">zum Produkt</a></td>
  </tr>
</table>
        
        '
;
        
$i++;
            }

        
$result mysql_query("SELECT TDCategoryName FROM shop WHERE TDCategoryName = '$CategoryName'");
        
$menge mysql_num_rows($result);

        
$wieviel_seiten $menge $eintraege_pro_seite;

        echo 
"<div align=\"center\">";
        echo 
"<b>Seite:</b> ";

        for(
$a=0$a $wieviel_seiten$a++)
           {
           
$b $a 1;

           if(
$TDCategoryName == $b)
              {
              echo 
"  <b>$b</b> ";
              }

           else
              {
              echo 
"  <a href=\"?CategoryName=$CategoryName&TDCategoryName=$b\">$b</a> ";
              }

               }
            echo 
"</div>";
}
}
?>
    <div align="center"></div></td>
  </tr>
</table>
<?php
    
include "../templates/Sphider-plus/footer.html";    
?>
<h1 align="center"><br>
</h1>
<center>
</center>
robydog ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 17.11.2008, 16:40  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Zitat:
$sql = "SELECT * FROM shop WHERE name = '$name' ";
$ergebnis = mysql_query($sql);
while($row = mysql_fetch_object($ergebnis))
{
$name_header = $row->name;
$description_header = $row->description;
}
$name_header und $description_header werden immer wieder überschrieben, so dass nach der Schleife nur der letzte Wert verfügbar ist. Aber ich nehme an, dass Du insgesamt nur 0 oder einen Datensatz abholen willst. Dann ist die Schleife überflüssig.

Zitat:
$sql="SELECT TDCategoryName FROM shop ORDER BY TDCategoryName";
$ergebnis = mysql_query($sql);
Hier werden sämtliche Datensätze aus der Tabelle shop vom MySQL Server in den PHP Prozess übertragen. Das ist so gewollt? Ist shop die Tabelle mit den 64k Einträgen?

Du willst insgesamt nur die einzelnen Kategorienamen ausgeben, oder?

Geändert von David (17.11.2008 um 16:43 Uhr).
David ist offline  
Alt 17.11.2008, 16:51  
Erfahrener Benutzer
 
Registriert seit: 02.03.2008
Beiträge: 351
robydog befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von David Beitrag anzeigen
$name_header und $description_header werden immer wieder überschrieben, so dass nach der Schleife nur der letzte Wert verfügbar ist. Aber ich nehme an, dass Du insgesamt nur 0 oder einen Datensatz abholen willst. Dann ist die Schleife überflüssig.
Das stimmt hier brauche ich nur eine Zeile

Zitat:
Zitat von David Beitrag anzeigen
Hier werden sämtliche Datensätze aus der Tabelle shop vom MySQL Server in den PHP Prozess übertragen. Das ist so gewollt? Ist shop die Tabelle mit den 64k Einträgen?

Du willst insgesamt nur die einzelnen Kategorienamen ausgeben, oder?
Es ist so dass in dieser Tabelle shop diese 64000 einträge sind. Es sollen noch mehr werden über ne halbe million!!!

Genau ich möchte hier nur die Kategorienamen ausgeben. Wusste aber nicht wie weil die Kategorienamen mehrmals vorkommen und jemand meinte hier im Forum mit Gruppen"irgendwas" und das ist dann das was ich gefunden hab so dass es doppelte Kategorienamen nur einmal anzeigt.

Hoffe das hilft sonst einfach fragen
robydog ist offline  
Alt 17.11.2008, 17:03  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Du hast hier keinen Gruppenbruch, denn Du willst vor dem Abfragen der eigentlichen Nutzdaten sämtliche Kategorien ausgeben. Beim Gruppenburch würden sich alle "Gruppenbezeichner" in den Nutzdaten befinden.
Deine Nutzdaten rufst Du mit
Zitat:
$sql = "SELECT name,imageUrl,price,currency,programName FROM shop WHERE TDCategoryName = '$CategoryName' ORDER BY TDCategoryName LIMIT $start, $eintraege_pro_seite";
ab. Da sind also nicht mehr alle Kategorienamen enthalten (nur noch einer) -> kein Gruppenbruch in dem Sinne.

Es wäre vermutlich besser, wenn Du die Namen der Kategorie nicht in dieser Tabelle speicherst, sondern eine weitere Tabelle anlegest mit
Code:
cat_id auto_inc, cat_name varchar/text/sowas
und dann in shop nur die jeweilige cat_id speicherst.
Aber für hier und jetzt: Es gibt hoffentlich einen Index auf das Feld TDCategoryName. Wenn nicht, nachholen.
PHP-Code:
$sql="
  SELECT
    Count(*) as c, TDCategoryName
  FROM
    shop
  GROUP BY
    TDCategoryName"
;
$ergebnis mysql_query($sql) or die(mysql_error());
while(
$row mysql_fetch_array($ergebnisMYSQL_ASSOC)) {
  
printf('<a href="?CategoryName=%s&amp;TDCategoryName=1">%s(%d)</a><br />'
    
urlencode($row['TDCategoryName']),
    
htmlspecialchars($row['TDCategoryName']),
    
$row['c']
  );

Die Ausgabe der Anzahl der Shops in einer Kategorie bekommst Du sozusagen als Bonus

Fehlerbehandlung und Behandlung von SQL Injections fehlt noch.
David ist offline  
Alt 17.11.2008, 17:04  
Erfahrener Benutzer
 
Benutzerbild von tomtaz
 
Registriert seit: 17.06.2008
Beiträge: 1.762
PHP-Kenntnisse:
Fortgeschritten
tomtaz ist einfach richtig netttomtaz ist einfach richtig netttomtaz ist einfach richtig netttomtaz ist einfach richtig netttomtaz ist einfach richtig nett
tomtaz eine Nachricht über ICQ schicken tomtaz eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von robydog Beitrag anzeigen
Genau ich möchte hier nur die Kategorienamen ausgeben. Wusste aber nicht wie weil die Kategorienamen mehrmals vorkommen und jemand meinte hier im Forum mit Gruppen"irgendwas" und das ist dann das was ich gefunden hab so dass es doppelte Kategorienamen nur einmal anzeigt.

Hoffe das hilft sonst einfach fragen
PHP-Code:
$sql="
SELECT 
  TDCategoryName 
FROM 
  shop
GROUP BY
  TDCategoryName 
ORDER BY 
  TDCategoryName ASC"
;
$ergebnis mysql_query($sql) or die ( 'SQL Error: ' mysql_error( ) ); 
Dann hast du nur noch einmal deine Kategorienamen drin, und dürfte die Performance steigern
__________________
Mfg Tomtaz
"Es soll jetzt diese Erfindung geben.... Kugel oder so heißt die. Ist so eine Art Suchmaschine..."
tomtaz ist offline  
Alt 17.11.2008, 17:10  
Erfahrener Benutzer
 
Registriert seit: 02.03.2008
Beiträge: 351
robydog befindet sich auf einem aufstrebenden Ast
Standard

Danke werde das mal so versuchen....

@ David Leider ist das nicht möglich dass ich ne eigene Tabelle machen kommen. Die Daten bekomme in einer csv Datei diese importiere ich dann einfach mittels phpmyadmin. und da kommt ja alles mit in die eine Tabelle
robydog ist offline  
Alt 17.11.2008, 17:14  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Zitat:
@ David Leider ist das nicht möglich dass ich ne eigene Tabelle machen kommen. Die Daten bekomme in einer csv Datei diese importiere ich dann einfach mittels phpmyadmin. und da kommt ja alles mit in die eine Tabelle
Nichts hindert Dich daran, diese Daten aufzubereiten.
David ist offline  
Alt 17.11.2008, 17:18  
Erfahrener Benutzer
 
Registriert seit: 02.03.2008
Beiträge: 351
robydog befindet sich auf einem aufstrebenden Ast
Standard

Ja das weiss ichs chon aber da bin ich dann wohl mit meinem Latein "Das sowieso nicht so besonders gross" ist am Ende. Ich weiss schon dass ich ein Script schreiben könnte was mir die csv Datei ausliest und in Tabellen speichert so wie ich das will. Aber schlussendlich ändert das nichts daran dass über 500000 Einträge rein sollen und ich denke nicht dass das Problem nur an den Kategorien liegt oder seh ich das falsch?
robydog ist offline  
Alt 17.11.2008, 17:24  
Erfahrener Benutzer
 
Registriert seit: 02.03.2008
Beiträge: 351
robydog befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von David Beitrag anzeigen
Aber für hier und jetzt: Es gibt hoffentlich einen Index auf das Feld TDCategoryName. Wenn nicht, nachholen.
öhm sorry was meinst du genau mit dem index auf das Feld?
robydog ist offline  
Alt 17.11.2008, 17:26  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

oh oh....
MySQL :: MySQL 5.0 Reference Manual :: 7.4.5 How MySQL Uses Indexes
David 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
Select / Left Join Performance mark007q Datenbanken 4 17.11.2008 15:14
ImageMagick Performance Problem M3g4Star PHP Tipps 2006 1 30.11.2006 09:35
Komplexe Funktion: +Übersichtlichkeit, -Performance Jacks Rache PHP Tipps 2006 3 07.06.2006 14:22
beim eintragen in mysql db gehen 7 von 66 eintr�gen verlor Marc PHP Tipps 2006 7 17.05.2006 14:30
Text in Rechtecke eintragen ?! PHP Tipps 2006 20 17.04.2006 18:41
Tabelle mit 117.649.000.000/567.869.252.000 Einträgen? Datenbanken 11 13.03.2006 18:29
Vererbung von Klassen und Performance ggfan PHP Tipps 2006 5 05.03.2006 12:00
[Erledigt] Bei doppelten Einträgen nur neuesten Anzeigen Datenbanken 6 15.02.2006 22:02
[Erledigt] HILFE BITTE! PHP Formular in MySQL eintragen... PHP Tipps 2005-2 9 01.10.2005 21:17
Datein in die DB eintragen PHP Tipps 2005 2 01.06.2005 19:54
Text und Zahl in Datenbankfeld eintragen ??? NetLook Datenbanken 5 28.04.2005 16:49
Performance verbessern PHP Tipps 2005 2 17.03.2005 13:29
Problem mit Bildern, die in eine DB eintragen werden sollen! PHP Tipps 2005 6 05.03.2005 17:26
[Erledigt] PHP Performance PHP-Fortgeschrittene 11 13.09.2004 07:25
Caching Performance PHP-Fortgeschrittene 2 13.07.2004 20:29

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
sphider suchformular ergebnisformular, mehr als 64000 daten in einer datei ausgeben, sphider formular includen, sphider plus tutorial, sphider bild ausgeben, csv dateien mehr als 64000, sphider doppelte, sphider letzter fehlt, mysql_fetch_object vererbung

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:18 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