Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL Query - Geschwindigkeit messen, "Sending Data"

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

    MySQL Query - Geschwindigkeit messen, "Sending Data"

    Hallo beisammen!

    Ich habe eine MYSQL-Abfrage gemessen und folgendes Ergebnis erhalten:

    Klicken Sie bitte auf die Grafik für eine vergrößerte Ansicht  Name: df_forum_nachfragen_slow_query2.jpg Ansichten: 0 Größe: 297,7 KB ID: 7769

    Jetzt wundere mich, warum "Sending Data" 99,9% der Zeit braucht.

    Das Ergebnis sind ja nur drei Datensätze - da muss doch nicht viel gesendet werden.
    Oder verstehe ich "Send data" falsch?

    Wie kann ich denn die Abfrage beschleunigen?

    Indizes sind bereits gesetzt.
    (Nachtrag: Kein Index ist jedoch gesetzt bei M.mess_read, M.mess_from und M.mess_type; letzteres ist "tinytext" ... sollte ich die Felder vielleicht doch auch noch indizieren?)

    Die Tabelle Messages ist die größe, sie hat gut 250.000 Datensätze.
    Die anderen, gejointen Tabellen sind Kunden (gut 16.000 Datensätze), Listen_Elemente (7.800) und Listen_IDs (1.200).

    Danke für Eure Unterstützung und herzliche Grüße,
    Anton
    Zuletzt geändert von Anton Korduan; 02.12.2020, 15:10.

    #2
    Schwierig zu beurteilen.
    Hier werden sehr viele Datensätze miteinander verknüpft. Die temporäre Tabelle dürfte daher enorm groß sein.

    Mein Vorschlag wäre, dass du diese Abfrage in einem VIEW speicherst und dann den Table-View abfragst statt der original Tabellen.

    Das dürfte einen enormen Schub bringen, da die Daten für die Anfrage nicht mehr aufbereitet werden müssen.
    MfG,
    masterframe

    Kommentar


      #3
      Zitat von masterframe Beitrag anzeigen
      Schwierig zu beurteilen.
      Hier werden sehr viele Datensätze miteinander verknüpft. Die temporäre Tabelle dürfte daher enorm groß sein.

      Mein Vorschlag wäre, dass du diese Abfrage in einem VIEW speicherst und dann den Table-View abfragst statt der original Tabellen.

      Das dürfte einen enormen Schub bringen, da die Daten für die Anfrage nicht mehr aufbereitet werden müssen.
      Danke für Deine Antwort!

      Habe noch nie mit Views gearbeitet.
      So ein View ist dann aber nicht aktuell, oder - das ist dann wahrscheinlich nur eine Momentaufnahme, oder?
      Das wäre nämlich schon Voraussetzung, dass die Daten aktuell sind...

      Na, vielleicht behelfe ich mir damit die Struktur der Abfrage zu überdenken und zu vereinfachen.

      Ich überlege auch, ob ich z.B. das Feld L.admin_id direkt nochmal in die große Messages-Tabelle einbinde - dann brauche in u.U. nach der Vereinfachung die komplette Tabelle Listen_IDs (L) nicht mehr zu verknüpfen.


      Kommentar


        #4
        Ein Table-View ist quasi eine gespeicherte Datenbank-Abfrage.
        Mit dem entscheidenden Unterschied, dass nicht ein „starres“ Ergebnis abgespeichert wird, sondern der Table-View aktualisiert sich selbsttätig sobald sich eine der Tabellen in der gespeicherten Abfrage ändert.

        Der View zeigt also immer das aktuelle Ergebnis der Abfrage OHNE die leidige Wartezeit, da das Ergebnis bereits vorliegt und eben NICHT erst umständlich gejoint werden muss.

        Bevor ich nicht mit Views gearbeitet hatte wusste ich gar nicht wie genial man damit große gejointe Datenmengen verarbeiten kann.

        Also nix wie ran und coden!
        MfG,
        masterframe

        Kommentar


          #5
          Zitat von masterframe Beitrag anzeigen
          Ein Table-View ist quasi eine gespeicherte Datenbank-Abfrage.
          Mit dem entscheidenden Unterschied, dass nicht ein „starres“ Ergebnis abgespeichert wird, sondern der Table-View aktualisiert sich selbsttätig sobald sich eine der Tabellen in der gespeicherten Abfrage ändert.

          Der View zeigt also immer das aktuelle Ergebnis der Abfrage OHNE die leidige Wartezeit, da das Ergebnis bereits vorliegt und eben NICHT erst umständlich gejoint werden muss.

          Bevor ich nicht mit Views gearbeitet hatte wusste ich gar nicht wie genial man damit große gejointe Datenmengen verarbeiten kann.

          Also nix wie ran und coden!
          DAS klingt ja wirklich genial.

          Ich werde googeln ... vielen Dank!

          PS: Habe gegoogelt und dies scheint mir ein guter Einstieg zu sein: https://www.mysqltutorial.org/mysql-...tutorial.aspx/
          Zuletzt geändert von Anton Korduan; 03.12.2020, 16:24.

          Kommentar


            #6
            Ja das Tutorial passt.
            MfG,
            masterframe

            Kommentar


              #7
              masterframe

              Hab jetzt das Tutorial durchgelesen und auch sonst noch recherchiert - aber das Views die Performance verbessern ... das habe ich nicht gefunden.

              Schau' zum Beispiel hier:

              I say VIEWs are syntactic sugar, not a performance benefit.
              Oder:

              Views don't modify the performance of your database. The performance is the same as the select it includes. The views are not used to increment performance or deliver pages faster, they are used for two things:
              • The use of a view lets you grant permisions to users on different tables so they don't see all information in the table (they only see what you want and in the way you want)
              • If you use the same select query in different places in your code, if you need to modify it, you can just modify the view and not every query in your code

              Beides aus dieser Quelle: https://stackoverflow.com/questions/...ce-and-latency


              Ich habe auch nirgends zu Views etwas gefunden, das zu Deiner Beschreibung passt (Hervorhebung von mir):

              Zitat von masterframe Beitrag anzeigen
              Ein Table-View ist quasi eine gespeicherte Datenbank-Abfrage.
              Mit dem entscheidenden Unterschied, dass nicht ein „starres“ Ergebnis abgespeichert wird, sondern der Table-View aktualisiert sich selbsttätig sobald sich eine der Tabellen in der gespeicherten Abfrage ändert.
              Meinst Du vielleicht etwas anderes als ein View?

              Kommentar


                #8
                Nein, ich meine Table-Views.
                Ich kann nur aus eigener Erfahrung sagen, dass meine Anwendung (Onlineshop mit über 20.000 Artikeln und damit verknüpften Artikelmerkmalen) durch das Verwenden von Views extrem schneller geworden ist.
                Die Produktkategorien liegen jetzt mit allen Artikeln inkl. Merkmalen in einem View. Vorher mussten 7 Tabellen miteinander gejoint werden was, wir bei dir, die MySQL-Abfrage auf über 3 Sekunden verlängert hat.
                Jetzt kann ich mir einfach aus dem View alle Artikel mit dem entsprechenden Kategoriemerkmal ziehen und fertig ist Produktkategorie. Das dauert nur den Bruchteil einer Sekunde.

                Aber meine Erfahrungen müssen nicht zwangsläufig allgemeingültig sein.
                MfG,
                masterframe

                Kommentar


                  #9
                  Zitat von masterframe Beitrag anzeigen
                  Nein, ich meine Table-Views.
                  Ich kann nur aus eigener Erfahrung sagen, dass meine Anwendung (Onlineshop mit über 20.000 Artikeln und damit verknüpften Artikelmerkmalen) durch das Verwenden von Views extrem schneller geworden ist.
                  Die Produktkategorien liegen jetzt mit allen Artikeln inkl. Merkmalen in einem View. Vorher mussten 7 Tabellen miteinander gejoint werden was, wir bei dir, die MySQL-Abfrage auf über 3 Sekunden verlängert hat.
                  Jetzt kann ich mir einfach aus dem View alle Artikel mit dem entsprechenden Kategoriemerkmal ziehen und fertig ist Produktkategorie. Das dauert nur den Bruchteil einer Sekunde.

                  Aber meine Erfahrungen müssen nicht zwangsläufig allgemeingültig sein.
                  Ja, ich spreche auch von Table-Views (kurz "Views").

                  Aber am Besten probiere ich es einfach mal aus - kann uns doch egal sein, was geschrieben steht.
                  Wenn's schneller wird passt es :-)

                  Kommentar


                    #10
                    Hallo nochmal, masterframe

                    Nein, sorry - bei mir hat das mit dem View zu keiner Geschwindigkeitsverbesserung geführt.

                    Ich habe mit "CREATE VIEW viewname AS ..." eine Table-View erzeugt, hier das Messergebnis:

                    Klicken Sie bitte auf die Grafik für eine vergrößerte Ansicht

Name: df_forum_MySQL_VIEW.jpg
Ansichten: 53
Größe: 180,4 KB
ID: 7966


                    Ich verstehe nicht, warum die Abfragen bei Deinem Onlineshop extrem schneller wurden wogegen bei mir kein Effekt eingetreten ist (es wurde sogar langsamer).

                    Verstehst Du das?
                    Oder versteht das sonst jemand hier?
                    *ratlos*

                    Danke und herzliche Grüße,
                    Anton

                    Kommentar


                      #11
                      Dann probiere mal bitte folgenden Query
                      Code:
                      SELECT vt.* FROM ( SELECT * FROM `viewname` ) as vt
                      Sieht seltsam aus, sollte aber wesentlich schneller sein.
                      Zuletzt geändert von masterframe; 18.12.2020, 13:21.
                      MfG,
                      masterframe

                      Kommentar


                        #12
                        Danke für Deine Unterstützung, masterframe

                        Hab's gleich ausprobiert ... ist aber leider auch nicht schneller.
                        "Klingt komisch, iss aber so" :-)

                        Klicken Sie bitte auf die Grafik für eine vergrößerte Ansicht

Name: view_table2.jpg
Ansichten: 45
Größe: 28,7 KB
ID: 7981

                        Kommentar

                        Lädt...
                        X