performance / php Erstellungszeit

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • performance / php Erstellungszeit

    Hallo Leute,

    hab da mal ne frage,

    Es gibt ja ein paar Scriptteile womit man die Erstellungszeit messen kann.

    Nun ist die frage aber welcher Zeit sollte man sich nochmal gedanken über sein script machen?

    ab 1 sek. mehr oder schon bei weniger?

    Bei mein jetzt selbst geproggten Shop befindet sich die Erstellungszeit (bis auf dem Produktkatalog) im 0,0irgendwas Bereich, Im Produktkatalog liegt die zeit oft im Bereich von 0,9-2,6 sek. Bereich.
    mfg
    marc75

    <Platz für anderes>

  • #2
    kommt drauf an ... eine Sekunde, um 10000 Artikel aufzulisten ist ok. eine Sekunde für den Überblick über ein paar Kategorien ist sicher optimierungsbedürftig.
    mein Sport: mein Frühstück: meine Arbeit:

    Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

    Kommentar


    • #3
      es werden immer 10 artikel ausgegeben und dazu eine Blätterfunktion.

      Muss ich nächste Woche mal schauen was sich noch finden läßt.
      mfg
      marc75

      <Platz für anderes>

      Kommentar


      • #4
        dafür ist eine Sekunde definitiv zu viel.
        Viel kann ich dazu ohne Einsicht in den Source selbstverständlich nicht sagen.

        Aber der "beliebteste" Fehler ist, sämtliche Datensätze zu selektieren, um an die Anzahl zu kommen.

        Das muss natürlich in zwei Queries aufgeteilt werden:

        1. select count(*) ohne limit --> Anzahl
        2. select * ... limit xx, 10 --> Artikel
        mein Sport: mein Frühstück: meine Arbeit:

        Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

        Kommentar


        • #5
          man selected ausser bei COUNT(*) nicht *.

          ich empfehle dir deine mysql indize mal anzusehen.
          da kann man sehr gut optimieren, wenn die nicht richtig gesetzt sind.

          Kommentar


          • #6
            und warum mach ich das bei count?

            hat die datenbank da weniger arbeit als bei der angabe von COUNT(od) ?
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              zuerst einmal kannst du deine query beispielsweise in phpmyadmin mit BENCHMARK testen.

              PHP-Code:
              SELECT BENCHMARK(wiederholungenausdruck); 
              dann prüfst du ob deine "id"-felder, also die felder mit denen tabellen verknüpft sind indiziert sind.

              wenn du eine tabelle news hast mit dem auto-increment feld "id", und eine tabelle news_comments mit dem auf die tabelle "news" bezogenen feld "news_id" dann setzt du natürlich einen index auf "news.id", aber du musst auch noch einen index auf "news_comments.id" setzen.

              In general, when you want to make a slow SELECT ... WHERE query faster, the first thing to check is whether you can add an index. All references between different tables should usually be done with indexes.
              @mrhappiness:
              COUNT(*) is somewhat different in that it returns a count of the number of rows retrieved, whether or not they contain NULL values. COUNT(*) is optimized to return very quickly if the SELECT retrieves from one table, no other columns are retrieved, and there is no WHERE clause.
              http://www.mysql.com/doc/en/GROUP-BY-Functions.html
              Zuletzt geändert von rythms; 28.03.2004, 13:16.

              Kommentar


              • #8
                Original geschrieben von Titus
                dafür ist eine Sekunde definitiv zu viel.
                Viel kann ich dazu ohne Einsicht in den Source selbstverständlich nicht sagen.

                Aber der "beliebteste" Fehler ist, sämtliche Datensätze zu selektieren, um an die Anzahl zu kommen.

                Das muss natürlich in zwei Queries aufgeteilt werden:

                1. select count(*) ohne limit --> Anzahl
                2. select * ... limit xx, 10 --> Artikel

                momentan mache ich das so:

                PHP-Code:
                //wenn keine Unterkategorie ausgewählt wurde, diese abfrage
                $sql_art mysql_query("
                SELECT 
                    id,
                    bildklein,
                    beschreibung,
                    vari1,
                    vari2,
                    vari3,
                    vari4,
                    preis_alt,
                    preis,
                    artikel_name,
                    artikel_nr,
                    lagerbestand 
                FROM " 
                TABLE_PRODUKTE 
                    where kat = "
                .mysql_escape_string($kat).
                    and aktiv = 1 
                    order by artikel_name 
                    LIMIT "
                .mysql_escape_string($blatt).", ".$wanzeigen."");

                while(
                $row mysql_fetch_object($sql_art))
                {
                Artikeldaten zusammenstellen und in einem Aray speichern.
                }

                //danach wird zwecks Blättern noch eine abfrage gemacht.

                $sql_check mysql_query("
                    SELECT 
                        count(id) 
                    FROM " 
                TABLE_PRODUKTE 
                        where kat = "
                .mysql_escape_string($kat).
                        and aktiv = 1"
                );

                $anzahl mysql_result($sql_check,0);

                if(
                $anzahl $weiterb)
                {
                //per if und for wird hier dann die Blätterfunktion zusammengebastelt.

                mfg
                marc75

                <Platz für anderes>

                Kommentar


                • #9
                  und wozu liest du erst alle daten ein?

                  wie wär's damit:

                  Anzahl Datensätze zählen
                  Vorhandensein einer Seitenangabe ($seite) prüfen (Übergabe per Link)
                  $seite ggf. korrigieren
                  datensätze lesen: LIMIT $seite*$pro_seite, $pro_seite
                  Links zum Blättern erzeugen (falls nötig)
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    Original geschrieben von rythms

                    ich empfehle dir deine mysql indize mal anzusehen.
                    da kann man sehr gut optimieren, wenn die nicht richtig gesetzt sind.
                    die Tab Struktur sieht so aus:

                    Code:
                     
                    CREATE TABLE `puzzle_produkte` (
                      `id` int(11) NOT NULL auto_increment,
                      `artikel_nr` varchar(30) NOT NULL default '',
                      `kat` smallint(3) NOT NULL default '0',
                      `ukat` smallint(3) NOT NULL default '0',
                      `hersteller` smallint(3) NOT NULL default '0',
                      `vari1` smallint(4) NOT NULL default '0',
                      `vari2` smallint(4) NOT NULL default '0',
                      `vari3` smallint(4) NOT NULL default '0',
                      `vari4` smallint(4) NOT NULL default '0',
                      `artikel_name` varchar(90) default NULL,
                      `beschreibung` text,
                      `bildklein` varchar(60) default NULL,
                      `bildgross` varchar(60) default NULL,
                      `preis_alt` decimal(12,2) default NULL,
                      `preis` decimal(12,2) default NULL,
                      `mwstsatz` tinyint(2) NOT NULL default '0',
                      `datum` datetime NOT NULL default '0000-00-00 00:00:00',
                      `aktiv` tinyint(1) NOT NULL default '0',
                      `lagerbestand` smallint(5) NOT NULL default '0',
                      `wie_oft_bestellt` smallint(6) NOT NULL default '0',
                      PRIMARY KEY  (`id`),
                      KEY `kat` (`kat`),
                      KEY `ukat` (`ukat`),
                      KEY `id` (`id`),
                      KEY `aktiv` (`aktiv`),
                      FULLTEXT KEY `beschreibung` (`beschreibung`,`artikel_name`)
                    ) TYPE=MyISAM AUTO_INCREMENT=23 ;

                    index liegt auf:
                    id (für detailansicht)
                    kat (für Artikelübersicht)
                    ukat (für Artikelübersicht mit Unterrubrik)
                    aktiv (ob Artikel für Kunden sichtbar oder nicht on/off)
                    beschreibung (für Suchfunktion)
                    artikel_name (für Suchfunktion)
                    mfg
                    marc75

                    <Platz für anderes>

                    Kommentar


                    • #11
                      Original geschrieben von mrhappiness
                      und wozu liest du erst alle daten ein?

                      wie wär's damit:

                      Anzahl Datensätze zählen
                      Vorhandensein einer Seitenangabe ($seite) prüfen (Übergabe per Link)
                      $seite ggf. korrigieren
                      datensätze lesen: LIMIT $seite*$pro_seite, $pro_seite
                      Links zum Blättern erzeugen (falls nötig)
                      mhh ganz verstanden hab ich das jetzt noch nicht.

                      also meinst du das jetzt so:

                      PHP-Code:
                      //Zählen der Datensätze
                      $sql_check mysql_query("
                          SELECT 
                              count(id) 
                          FROM " 
                      TABLE_PRODUKTE 
                              where kat = "
                      .mysql_escape_string($kat).
                              and aktiv = 1"
                      );

                      $anzahl mysql_result($sql_check,0);

                      //vorhanden sein einer Seitenangabe prüfen
                      if(empty($_GET['blatt'])){ $blatt 0; }
                      else {
                      $blatt $_GET['blatt'];}

                      //Datensätze lesen
                      $sql_art mysql_query("
                      SELECT 
                          id,
                          bildklein,
                          beschreibung,
                          vari1,
                          vari2,
                          vari3,
                          vari4,
                          preis_alt,
                          preis,
                          artikel_name,
                          artikel_nr,
                          lagerbestand 
                      FROM " 
                      TABLE_PRODUKTE 
                          where kat = "
                      .mysql_escape_string($kat).
                          and aktiv = 1 
                          order by artikel_name 
                          LIMIT "
                      .mysql_escape_string($blatt).", ".$wanzeigen."");
                      //$blatt kommt per link ausser beim ersten aufruf wird 0 gesetzt
                      //wanzeigen kommt vom Script (confi) ist z.B. 10

                      //artikel erzeugen
                      while()
                      //eventl. Links erzeugen



                      //da ich dich jetzt nicht ganz verstanden habe, sehe ich da irgendwie
                      //keinen Unterschied zu meiner Anordnung 
                      mfg
                      marc75

                      <Platz für anderes>

                      Kommentar

                      Lädt...
                      X