Schulnote für Query

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

  • Schulnote für Query

    Hallo,

    ich hatte vor dem Wochenende schon ein Post aufgemacht bzgl. meiner Server Perfomance und meiner Querys bzgl. INDEX usw...

    Einige sehr erfahrene Leute hier im Forum haben mir da schon super
    weiter geholfen. Dadurch konnte ich meine Datenbank nun auch gut
    optimieren nun wollte ich noch eure Meinung zu meiner Query-Laufzeit einholen ob diese nun akzeptabel oder immer noch zu schlecht sind.

    hilfreich wäre mir einfach eine Benotung von 1-6 wobei 1 sehr gut ist.

    Alle meine Query´s liegen jetzt so im Bereich von 0.05 und 0.02 Sek

    Hier ein Auszug aus einem Query die alle änhlich aufgebaut sind:

    tbl_artikel = 5.500 rows
    tbl_zuweisung = 5.700 rows
    tbl_bild = 11.500 rows
    tbl_happyhour = 14.500 rows

    Zeige Datensätze 0 - 0 (1 insgesamt, die Abfrage dauerte 0.0312 sek.)
    PHP-Code:

    SELECT t1
    .id_artikel,t3.titel,t4.bildpfad,t2.id_verwendung
    FROM s_happyhour 
    as t1 
    INNER JOIN s_zuweisung 
    as t2 ON t1.id_artikel t2.id_artikel 
    INNER JOIN s_artikel 
    as t3 ON t1.id_artikel t3.id_artikel
    INNER JOIN s_bild 
    as t4 ON t1.id_artikel t4.id_artikel 
    WHERE t1
    .uhrzeit 13 
    AND aktiv 
    AND aktiv_gr 
    AND t2.id_verwendung 1
    ORDER BY RAND
    () LIMIT 0,1

    EXPLAIN
    :
    id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
    1 SIMPLE t1 ref id_artikel
    ,uhrzeit uhrzeit 2 const 601 Using temporaryUsing filesort 
    1 SIMPLE t3 eq_ref PRIMARY
    ,aktiv,aktiv_gr PRIMARY 8 usr_web1_1.t1.id_artikel 1 Using where 
    1 SIMPLE t2 ref artikel_verwendung artikel_verwendung 8 usr_web1_1
    .t1.id_artikel 1 Using index 
    1 SIMPLE t4 ref id_artikel id_artikel 8 usr_web1_1
    .t1.id_artikel 4 
    Zuletzt geändert von tomtherock; 26.11.2007, 13:20.

  • #2
    Das ORDER BY RAND() ist böse.
    Nutz mal Google, ich find gerade den passenden Blog-Eintrag nicht, aber RAND ist insofern böse, als dass der Server alle Datensätze mit einer zufälligen ID versehen muss, was ungünstig ist... da gibt es so Pseudo-Random-"Algorithmen", mit denen man diesen Engpass umgehen kann.


    btw. du hättest auch den anderen Thread benutzen können.

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      ja also order by RAND() is anscheinend echt böse ohne das braucht der Query nur noch 0.006 sek

      Ich frag mich halt für was hat MySQL Funktionen drin wenn man die eigentlich eh nicht wirklich nutzen kann außer man hat ne kleine poppel Homepage wo es eh nix ausmacht...

      Denke werd das halt per compiler dann machen mit array_rand()



      Aber danke dir war jetzt total auf INDEX und spalen typen fixiert

      Kommentar


      • #4
        Man kann RAND() ja nicht nur in Verbindung mit ORDER BY benutzen.
        Man könnte z.B. auch ein
        UPDATE tabelle SET rand = RAND();
        machen,
        dann ein
        SELECT * FROM tabelle WHERE rand IS NOT NULL ORDER BY rand LIMIT 1;
        UPDATE tabelle SET rand = NULL WHERE id = XYZ;
        und so weiter und so fort~

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          ja stimmt auch ned schlecht ich mach jetzt einfach
          $num = mysql_num_rows
          $rand = rad(1,$num);

          und danach

          dann einfach LIMIT ($rand,1)

          so leufts dann schon recht flott evtl. muss ich schauen ob ich nicht das ganze komplett mit array_rand auf den compiler auslagere um einfach den DB server zu entlasten weil mysql_num_rows kostet ja auch wieder DB performance....

          vorallem mein DB und Webserver sind ein server(hardware)

          Kommentar


          • #6
            mysql_num_rows ist so teuer, weil du alle Datensätze selektierst und anschließend zählst. Verwende direkt
            Code:
            select count(*) from tabelle

            Kommentar


            • #7
              Ne, auch eine eher schlechte Lösung:
              http://www.mysqlperformanceblog.com/...-optimization/
              Unter der Überschrift: "Beware of large LIMIT"

              Und gerade wo du mit 4 Tabellen joinst, ist das Wegwerfen von Datensätzen eine eher schlechte Idee.

              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
              Wie man Fragen richtig stellt

              Kommentar


              • #8
                Ne, auch eine eher schlechte Lösung:
                http://www.mysqlperformanceblog.com/...-optimization/
                Unter der Überschrift: "Beware of large LIMIT"

                Und gerade wo du mit 4 Tabellen joinst, ist das Wegwerfen von Datensätzen eine eher schlechte Idee.
                Oi, sehr interessant, wusste ich noch nicht!

                Kommentar


                • #9
                  ja schon sehr interessanter Beitrag auch wenn ich nicht alles 100%ig verstanden hab, aber den größten teil...langsam kommt es mir so vor als
                  wäre es am besten nur ganz ganz einfach querys zu nutzen ohne viel schnick schnack wenn man gute Perfomance haben will...dann stellt sich nur
                  die Frage wieso die ganzen tollen Funktionen in MySQL ^^.

                  Kommentar


                  • #10
                    Natürlich wäre es am schnellsten, wenn man immer nur einfache Queries benutzen könnte. Aber dafür muss man die Daten denormalisieren, was wiederum der Struktur entgegen wirkt.

                    Ich persönlich würde ja jetzt meine Variante mit den obigen Queries bevorzugen... erfordert natürlich etwas Umprogrammierung im Skript.
                    Aber wie gesagt -> Google. Das RAND() böse ist hab ich mir ja auch nicht aus den Fingern gesogen und es gibt bestimmt irgendwo hübsche(re) Workarounds, als meiner~

                    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                    Wie man Fragen richtig stellt

                    Kommentar


                    • #11
                      ja klar glaub dir da schon hab ja jetzt auch mal im Internet bissal
                      gestöbert...stimmt schon rand() ist nicht so dolle nur warum MYSQL dann
                      so ne BETA Funktion drin hat frag ich mich halt bzw einfach unausgereift..

                      Ich kann ja auch nicht ne PHP Class machen die dann den Webserver um bis zu 80% einbrechen lässt naja...egal.

                      Hab jetzt eigentlich super Ergebnisse mit folgendem gemacht:

                      einfach query ohne LIMIT und rand()
                      alle per while/for in array schreiben

                      mit count einfach max für rand() berechnen und dann so
                      id_artikel[$key] einfach ansprechen so is der QUERY superschnell und
                      der Compiler hat auch bissal was zu tun.

                      hab ein paar scripte überarbeitet und zeigt schon die ersten erfolge weil
                      ich viele Temp Tabellen dadurch vermeide vorallem auch mit EXISTS anstatt mit JOINS

                      Kommentar


                      • #12
                        ja klar glaub dir da schon hab ja jetzt auch mal im Internet bissal
                        gestöbert...stimmt schon rand() ist nicht so dolle nur warum MYSQL dann
                        so ne BETA Funktion drin hat frag ich mich halt bzw einfach unausgereift..

                        Ich kann ja auch nicht ne PHP Class machen die dann den Webserver um bis zu 80% einbrechen lässt naja...egal.
                        Na, da vergleichst du jetzt aber Äpfel mit Birnen.

                        Stell dir vor, du schreibst ne schöne klasse zur Thumbnail-Generierung und haustein kommt vorbei und nutzt das ding für seine Galerie-Übersichts-Seite und erzeugt die Bilder immer wieder "on the fly".

                        Kommentar


                        • #13
                          naja Bilddaten umrechnen und paar Bytes an Zeichen zu vergleichen ist aber auch nochmal was anderes :P

                          Kommentar


                          • #14
                            Stell dir vor, du schreibst ne schöne klasse zur Thumbnail-Generierung und haustein kommt vorbei und nutzt das ding für seine Galerie-Übersichts-Seite und erzeugt die Bilder immer wieder "on the fly".
                            OffTopic:
                            Sag mal, hast du was gegen haustein?

                            Kommentar


                            • #15
                              OffTopic:
                              ich kenne ihn gar nicht. Aber ich habe generell etwas gegen "diese" Art von "Fragen".

                              Kommentar

                              Lädt...
                              X