geschwindigkeit

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

  • geschwindigkeit

    ich habe ein kleines bildervotingscript geschrieben und die abfrage ist trotz weniger einträge bereits sehr lansam...

    woran liegts???

    PHP-Code:
     $sql safe_query("SELECT bildid, datei, owner FROM loungebilder WHERE ((votes > '10' AND summe > '16') OR votes <= '10') 
      and owner != '
    $U' and allow_votes = 1 and bildid not in 
       (SELECT bildid FROM picvotes   WHERE userid = '
    $U') 
    ORDER BY RAND() LIMIT 1"
    ); 
    dauert auch ohne not in elemente meiner meinung nach genauso lange

  • #2
    MySQL führt Subselects nicht besonders schnell aus. Das Order by rand() ist sicher auch ein Problem. Führe mal ein Explain select ... aus und poste das Ergebnis hier.

    Kommentar


    • #3
      Zitat von PHP-Desaster Beitrag anzeigen
      MySQL führt Subselects nicht besonders schnell aus. Das Order by rand() ist sicher auch ein Problem. Führe mal ein Explain select ... aus und poste das Ergebnis hier.
      hm google konnt mit ned helfen, wie mach ich sowas?

      Kommentar


      • #4
        Einfach ein EXPLAIN vor deinen Query schieben (letzter Listenpunkt)
        [FONT="Helvetica"]twitter.com/unset[/FONT]

        Shitstorm Podcast – Wöchentliches Auskotzen

        Kommentar


        • #5
          Code:
          EXPLAIN SELECT bildid, ...........................
          Am einfahsten in phpmyadmin.

          Hast du auch einen INDEX für alle Spalten im WHERE gesetzt?

          Warum setzt du Zahlen in Anführungszeichen?
          Andere DBMS würden dir das um die Ohren hauen.
          Wir werden alle sterben

          Kommentar


          • #6
            ja hab ich aber wie les ichs aus da kommt dann einfach nix. aso im phpmyadmin... auf der seite direkt mit php geht sowas nich?
            nein hab keine indexe gemacht. neuland

            id select_type table type possible_keys key key_len ref rows Extra
            1 PRIMARY loungebilder ALL 1051 Using where; Using temporary; Using filesort Ändern Löschen
            2 DEPENDENT SUBQUERY picvotes ALL 177 Using where Ändern Löschen
            Zuletzt geändert von keks333; 23.11.2009, 11:28.

            Kommentar


            • #7
              und weiter?

              Kommentar


              • #8
                Wie? Und?
                Was hast du mittlerweile erledigt?


                Zeige doch bitte mal das "jetzige" CREATE Statement und dein repariertes SELECT
                Wir werden alle sterben

                Kommentar


                • #9
                  Zitat von keks333 Beitrag anzeigen
                  und weiter?
                  Hast du das schon behoben?:

                  Zitat von combie Beitrag anzeigen
                  Hast du auch einen INDEX für alle Spalten im WHERE gesetzt?

                  Warum setzt du Zahlen in Anführungszeichen?
                  [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                  Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                  Super, danke!
                  [/COLOR]

                  Kommentar


                  • #10
                    ich gebs auf ich hab schon ewig gesucht jetz.
                    ich wollte den subquery mit MINUS beheben was theretisch funktioneiren würde denke ich aber zeigt immer query fehler.

                    ich habe gegooglt und den sinn eines indexes vertsanden . steht auch überall wie man einen macht mit sql aber nicht wie man den dann ausliest bzw mit php verarbeitet.

                    kann mir jemand helfen und einfach ma ein beipiel geben (aus meiner vorlage)
                    subquery raus ( mit joins oder so ka oder mit MINUS? )

                    das EXPLAIN hab ich euch ja geliefert...
                    wär euch echt dankbar. konkrete beispiele sind echt rar

                    beisiele wie [COLOR=#0000ff]CREATE INDEX IDX_CUSTOMER_LAST_NAME on CUSTOMER (Last_Name)[/COLOR]
                    sind ja toll aber hilft mir kaum, was mach ich dann mit dem restlichen query bzw dem index? stehe aufm schlauch

                    lg
                    Zuletzt geändert von keks333; 23.11.2009, 20:26.

                    Kommentar


                    • #11
                      Indizes brauchst du nicht auszulesen oder mit PHP zu verarbeiten. Sie helfen dem DBMS nur, Datensätze schneller zu finden. Du indizierst einfach die richtigen* Spalten und schon geht alles schneller. Das ist alles

                      ___
                      * die richtigen sind solche, die von Joins mit on oder using benutzt werden oder in Where-Klauseln auftauchen.
                      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                      Super, danke!
                      [/COLOR]

                      Kommentar


                      • #12
                        aber nicht wie man den dann ausliest bzw mit php verarbeitet.
                        Tut man ja auch nicht. Wieso auch?
                        Ein INDEX beschleunigt das Auslesen, bzw. die Vergleiche im WHERE.

                        das EXPLAIN hab ich euch ja geliefert...
                        Das Ergebnis des EXPLAIN sollte sich jetzt geändert haben.
                        (hoffen wir es mal)

                        Wenn es irgend geht, solltest du den Subselect entsorgen und stattdessen einen JOIN verwenden.
                        Zuletzt geändert von combie; 23.11.2009, 20:28.
                        Wir werden alle sterben

                        Kommentar


                        • #13
                          Zitat von combie Beitrag anzeigen
                          Wenn es irgend geht, solltest du den Subselect entsorgen und stattdessen einen JOIN verwenden. .
                          wollte statt NOT IN , MINUS nehmen wieso geht das nicht?

                          und wie mache ich in einem join einen tabellenvergleich in dem eine besteimmte konstelation "ausgeschlossen" wird?

                          könnt ihr mir einen ansatz geben ich weiß nich wo ich anfangen soll.
                          hab wirklich schon gesucht ohne ende. joins schön und gut aber wie realisier ich das NOT IN darin?

                          welche spalten sollte ich den indexieren um den besten erfolg zu bekommen? eine? mehere?
                          ich komm mir bissl dumm vor :-(

                          Kommentar


                          • #14
                            Mein Lieblingsthema: Negativer left Join
                            Code:
                            select
                            	l.bildid,
                            	l.datei,
                            	l.owner,
                            	rand() as position
                            from loungebilder as l
                            left join picvotes as p
                            	on p.bildid = l.bildid and p.userid = '$u'
                            where p.bildid is null
                            	and ((l.votes > '10' and l.summe > '16') or l.votes <= '10') 
                            	and l.owner != '$u'
                            order by position
                            limit 1
                            (nicht getestet)
                            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                            Super, danke!
                            [/COLOR]

                            Kommentar


                            • #15
                              Zitat von AmicaNoctis Beitrag anzeigen
                              Mein Lieblingsthema: Negativer left Join
                              Code:
                               [...]
                              (nicht getestet)
                              id select_type table type possible_keys key key_len ref rows Extra
                              1 SIMPLE l ALL 1061 Using where; Using temporary; Using filesort Ändern Löschen
                              1 SIMPLE p ALL 291 Using where; Not exists

                              funktioniert, ändert aber nix an der abfrage und dauert exact genauso lange. objektiv gesehn is bis jetz die not in abfrage genauso gut bzw schlecht ...
                              wo setze ich da am besten den index damits was taugt und endlich nicht ganze 3-4 sekunden zum laden braucht ???

                              wäre ein super referenz beispiel.

                              Kommentar

                              Lädt...
                              X