Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL Sehr lange Query dauer

Einklappen

Neue Werbung 2019

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

  • MySQL Sehr lange Query dauer

    Hallo, ich habe eine Tabelle in MySQL, die Bilder zu bestimmten Entitäten enthält (also eine url).
    Auf meiner Webseite gibt es nun ein php Skript, das zu einer bestimmten Anzahl an Entitäten (etwa 500) die Bilder heraussuchen und anzeigen soll.
    Das ganze habe ich so realisiert, dass ich pro Entität (item) genau eine Abfrage mache
    PHP-Code:
    foreach ($obj['result']['items'] as &$item) {
            
    $abfrage "SELECT * FROM items where defindex=".$item['defindex'];
            
    $ergebnis mysql_query($abfrage); 
    defindex ist hier der Primärschlüssel zur Identifikation.

    Das Problem das auftritt ist, dass wenn man die Seite aufruft der Server sehr lannge für die Queries braucht, was verständlich ist, da es etwa 500 Select Anfragen sind.
    Gibt es eine möglichkeit das zu optimieren etwa durch eine große Query oder andere Möglichkeiten?
    Vielen Dank euer Kalb

  • #2
    Code:
    where in
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Zitat von Arne Drews Beitrag anzeigen
      Code:
      where in
      Danke, werde mal schauen, wie lange das braucht

      Kommentar


      • #4
        Du weißt aber schon, daß Du dann eine einzige Query basteln kannst und das nicht für jedes Item einzeln machen musst bzw. solltest?!
        PHP-Code:
        $abfrage "SELECT * FROM `items` WHERE `defindex` IN (" implode(','$obj['result']['items']) . ")"
        ...evtl. zuvor nochmal mit
        PHP-Code:
        $aItems array_map'intval'$obj['result']['items'] ); 
        drüber laufen.
        Competence-Center -> Enjoy the Informatrix
        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

        Kommentar


        • #5
          So wie ich das sehe hat er die Items doch schon in
          PHP-Code:
          $obj['result']['items'
          , dass er sie nochmals (alle einzeln) abruft ergibt keinen Sinn.
          [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

          Kommentar


          • #6
            Die original mysql-Erweiterung ist veraltet (mysql_*-Funktionen) und wird in den kommenden Versionen aus PHP entfernt. Aktuell wirft sie schon E_DEPRECATED-Fehler bei einer Verbindung zur Datenbank. Des Weiteren stehen dir sehr viele tolle Features von mysql mit diesen Funktionen nicht zur Verfügung! Weiterführende Links:
            Choosing an API
            Warum man mysql* generell nicht (mehr) nutzen sollte.
            Wie man von mysql* auf PDO umsteigt
            Wissenswertes zum Thema SQL-Injection

            Kommentar


            • #7
              Zitat von tkausl
              , dass er sie nochmals (alle einzeln) abruft ergibt keinen Sinn.
              Sorry, worauf beziehst Du das?

              Das array_map sorgt ja dafür, daß die Items alle über intval "gefilter" werden.
              Natürlich muß dann im implode in der IN-Klausel auf $aItems zugegriffen werden.

              Meintest Du das?
              Competence-Center -> Enjoy the Informatrix
              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

              Kommentar


              • #8
                Nur zur Vollständigkeit:
                Code:
                SELECT *
                sorgt in den meisten Fällen für mehr als man tatsächlich benötigt, man sollte daher immer nur explizit die Spalten selektieren, die man auch tatsächlich benötigt.
                [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
                [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

                Kommentar


                • #9
                  Wenn das WHERE auf einen Primär Schlüssel geht, dürfte dein SELECT nur einen Datensatz enthalten. Somit kannst du am ende LIMIT 0,1 setzten:
                  PHP-Code:
                  $abfrage "SELECT * FROM items where defindex=".$item['defindex']." LIMIT 0,1"
                  Das dürfte die Suche schon erleichtern.
                  Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

                  Kommentar


                  • #10
                    Zitat von Moewe
                    Wenn das WHERE auf einen Primär Schlüssel geht, dürfte dein SELECT nur einen Datensatz enthalten. Somit kannst du am ende LIMIT 0,1 setzten
                    Krasser Widerspruch! Warum sollte man Limitieren, wenn bei Bezug auf den Primärschlüssel eh nur ein Datensatz zurückkommt...

                    Du gehst doch auch nicht zum Bäcker und sagst: "Ich hätte gerne ein Brötchen und davon bitte nur das erste..."
                    Competence-Center -> Enjoy the Informatrix
                    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                    Kommentar


                    • #11
                      Zitat von Arne Drews Beitrag anzeigen
                      Krasser Widerspruch! Warum sollte man Limitieren, wenn bei Bezug auf den Primärschlüssel eh nur ein Datensatz zurückkommt...

                      Du gehst doch auch nicht zum Bäcker und sagst: "Ich hätte gerne ein Brötchen und davon bitte nur das erste..."
                      Wenn der den Datensatz hat, soll er aufhören zu suchen.
                      Ist mein Wissen hier falsch?
                      Nur weil der einen Datensatz gefunden hat, hört der doch nicht auf zu prüfen ob noch ein Datensatz dieses Suchkriterium erfüllt? Oder ist automatisch die Suche nach nem Primärschüssel auf einen Datensatz beschränkt?

                      Wenn ich in einer Tabelle 15x Meier stehen habe und nur einmal Schmidt, braucht der bei der Suche nach Schmidt, wenn er diesen gefunden hat, nicht weiter suchen, ob es noch mehr Schmidt gibt.


                      Oder benutze ich seit Monaten LIMIT an dieser Stelle falsch?
                      Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

                      Kommentar


                      • #12
                        Zwischenfrage...

                        PHP-Code:
                        foreach ($obj['result']['items'] as &$item) {
                                
                        $abfrage "SELECT * FROM items where defindex=".$item['defindex'];
                                
                        $ergebnis mysql_query($abfrage); 
                        Resultiert $obj['result']['items'] auch schon aus einer Abfrage? Wenn, dann würde sich da ev. mit einem JOIN eine Gesamtabfage erstellen lassen?
                        The string "()()" is not palindrom but the String "())(" is.

                        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                        PHP.de Wissenssammlung | Kein Support per PN

                        Kommentar


                        • #13
                          @Moewe: Na wenn Du schon selbst Primärschlüssel in den Raum wirfst, solltst Du doch auch wissen, was den so besonders macht.

                          Klar kann es mehrere Meiers geben, aber nur einen einzigen mit dem Primärschlüssel (hier: defindex)!
                          Und wenn sich die Where-Klausel auf diesen Primärschlüssel bezieht, kann nur der eine gesuchte Meier rauskommen... Oder ein leeres Resultat, weil Primärschlüssel nicht vorhanden.

                          Wenn mehr als einer rauskommt, dürfte bei der Konstellation zuerst mal das DB-Design saniert werden, bevor es ans scripten geht...
                          LIMIT reduziert nicht die Anzahl zu durchsuchender Datensätze, sondern die Ergebnismenge.


                          @tkausl:
                          (gelöscht) ...ach ne, quatsch... Du bist ja einen Schritt weiter, sorry...
                          Competence-Center -> Enjoy the Informatrix
                          PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                          Kommentar


                          • #14
                            Zitat von Arne Drews Beitrag anzeigen
                            Na wenn Du schon selbst Primärschlüssel in den Raum wirfst, solltst Du doch auch wissen, was den so besonders macht.

                            Klar kann es mehrere Meiers geben, aber nur einen einzigen mit dem Primärschlüssel (hier: defindex)!
                            Und wenn sich die Where-Klausel auf diesen Primärschlüssel bezieht, kann nur der eine gesuchte Meier rauskommen... Oder ein leeres Resultat, weil Primärschlüssel nicht vorhanden.

                            Wenn mehr als einer rauskommt, dürfte bei der Konstellation zuerst mal das DB-Design saniert werden, bevor es ans scripten geht...
                            Achso, ich hätte jetzt angenommen dem DBM ist erstmal egal, ob es sich um einen Primärschlüssel handelt. Ich bin davon ausgegangen egal auf welche Spalte ich mich beziehe, die art der Suche bleibt gleich.

                            Daher habe ich immer, wenn ich wusste, ich werde nur einen Datensatz zurück bekommen, LIMIT 0,1 verwendet.

                            Danke für die Aufklärung der impliziten Suchbeschränkung bei Primärschlüsseln.
                            Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

                            Kommentar


                            • #15
                              Zitat von Moewe
                              Daher habe ich immer, wenn ich wusste, ich werde nur einen Datensatz zurück bekommen, LIMIT 0,1 verwendet.
                              Genau da brauchst Du kein LIMIT...

                              Ich hatte nochmal etwas zugefügt im Post drüber, vielleicht ist es dann verständlicher...
                              LIMIT reduziert nicht die Anzahl zu durchsuchender Datensätze, sondern die Ergebnismenge.
                              Competence-Center -> Enjoy the Informatrix
                              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                              Kommentar

                              Lädt...
                              X