Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL Config Performance bei schlechten Abfragen

Einklappen

Neue Werbung 2019

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

  • MySQL Config Performance bei schlechten Abfragen

    Hallo zusammen,

    ich habe es schon öfters erlebt und ihr kennt es sicherlich auch, es soll mal ganz schnell (einmalig) nebenbei irgendwas per Hand aus der Datenbank abgefragt werden. Nun kann es dabei passieren (da es halt schnell gehen muss...) das z.B. fehlerhafte Joins entstehen oder ähnliches die das Query bei einer größeren Datenbank schonmal auf eine Laufzeit von mehreren Minuten oder noch länger kommen.

    Ich weiss nicht ob das bei euch auch so ist, aber ich habe das Problem das dann der ganze MySQL Server solange für alles ewigkeiten brauch, bis dieses Query dann mal abgearbeitet ist.

    Gibt es eine Möglichkeit das die Performance des MySQL Servers für einzelne Query beschränkt wird oder etwas ähnliches um die Auswirkung von solchen Queries zu begrenzen?

    Gruß
    CyCap

  • #2
    Nein, derartiges kennt Mysql überhaupt nicht. Entweder du setzt dafür ein Slave auf oder lebst damit.

    Kommentar


    • #3
      Folgenden Hinweis habe ich dazu gefunden, aber noch nie probiert.

      How to kill Run Away Queries ?

      Have script which runs SHOW PROCESS LIST every second and kills them
      EDIT
      Eine zweite Idee mit einem Hint "/*TIMEOUT:30*/" , Stop nach 30 Sekunden, aber auch noch nicht selber probiert und es findet sich auch keine Doku dazu. Eventuell ein undokumentierter Entwicklertrick...

      Code:
      mysql> select /*TIMEOUT:30*/ col1, col2, col3 FROM tabelle1;
      Vielleicht eine Anregung...

      Grüße
      Thomas

      Kommentar


      • #4
        Moin,

        danke für die Antworten, aber das hilft mir wohl nicht weiter.

        Gruß
        Cy

        Kommentar


        • #5
          Zitat von thomas_w Beitrag anzeigen
          Eine zweite Idee mit einem Hint "/*TIMEOUT:30*/"
          Das ist keine zweite Idee und auch keine Entwicklertrick. Das gehöhrt beides zusammen. Mit show processlist suchst du regelmässig nach Queries die /*TIMEOUT:n*/ enthalten und killst sie wenn sie länger laufen als TIMEOUT.

          Kommentar


          • #6
            Zitat von erc Beitrag anzeigen
            Das ist keine zweite Idee und auch keine Entwicklertrick. Das gehöhrt beides zusammen. Mit show processlist suchst du regelmässig nach Queries die /*TIMEOUT:n*/ enthalten und killst sie wenn sie länger laufen als TIMEOUT.
            Ah ja, habe ich bisher nicht gewusst.
            Danke, wieder was gelernt.

            Grüße
            Thomas

            Kommentar


            • #7
              Er möchte aber aber die Queries nicht killen. Er möchte sie ja schließlich bis zu Ende ausführen. Das Problem ist nur dass eben alle anderen Queries dadurch verzögert werden, er möchte also den Query langsamer rechnen lassen so dass die anderen Queries nicht verzögert werden.

              Ich hab keine wirkliche Idee, aber ich stell es mir problematisch vor wenn dein Query irgendwelche Locks schreibt, denn dann hast du eigentlich keine Chance dass die anderen Queries abgearbeitet werden können.

              Kommentar


              • #8
                Also mein Kollege der MSSQL benutzt sagt das er damit keine Probleme hat, also scheint es rein theoretisch ja machbar zu sein. Bleibt also nur die Frage ob MySQL es kann und wenn ja, wie...

                Kommentar


                • #9
                  Zitat von cycap Beitrag anzeigen
                  Also mein Kollege der MSSQL benutzt sagt das er damit keine Probleme hat, also scheint es rein theoretisch ja machbar zu sein. Bleibt also nur die Frage ob MySQL es kann und wenn ja, wie...
                  MySQL bietet wohl noch keine so umfangreichen Verwaltungs-Tools wie MS-SQL, ORACLE, IBM DB2 etc. Mit diesen DB-Tools kann einer laufenden Abfrage eine bestimmte "Rechenzeit" bzw. Priorität zugewiesen werden.

                  Wie sieht es mit postgreSQL aus?

                  Wäre dass nicht auch eine Aufgabe für das "Load-Balancing?" (bin aber kein Admin)

                  Stellt sich letztlich auch die Frage, wie häufig "langlaufende" SQL entstehen. Wenn häufig, dann entweder die Programme optimieren (damit es nicht mehr so oft vorkommt) oder per EXPLAIN mal die Query/Datenbank optimieren.

                  Grüße
                  Thomas

                  Kommentar


                  • #10
                    MySQL bietet wohl noch keine so umfangreichen Verwaltungs-Tools wie MS-SQL, ORACLE, IBM DB2 etc. Mit diesen DB-Tools kann einer laufenden Abfrage eine bestimmte "Rechenzeit" bzw. Priorität zugewiesen werden.
                    Mir geht es weniger darum einzelne laufende Querys zu steuern, sondern mehr um das automatische handling. Also wenn ich eine schlechte Abfrage über 5 Tabellen habe die 5 minuten läuft, dann möchte ich, dass die zweite Abfrage, die gleichzeitig ganz andere Tabellen abfragt, nicht darunter leidet.

                    Wäre dass nicht auch eine Aufgabe für das "Load-Balancing?" (bin aber kein Admin)
                    Ich baue parallel dazu auch gerade meine Replikationen weiter aus, aber eine wirkliche "Lösung" ist das ja nicht.

                    Stellt sich letztlich auch die Frage, wie häufig "langlaufende" SQL entstehen. Wenn häufig, dann entweder die Programme optimieren (damit es nicht mehr so oft vorkommt) oder per EXPLAIN mal die Query/Datenbank optimieren.
                    Siehe Eröffnungspost:
                    es soll mal ganz schnell (einmalig) nebenbei irgendwas per Hand aus der Datenbank abgefragt werden
                    Gruß
                    Cy

                    Kommentar


                    • #11
                      Zitat von cycap Beitrag anzeigen
                      Also mein Kollege der MSSQL benutzt sagt das er damit keine Probleme hat
                      MSSQL spielt auch in einer anderen Liga, auch wenn ein gewisses Unternehmen anderes behauptet.

                      Zitat von cycap Beitrag anzeigen
                      Mir geht es weniger darum einzelne laufende Querys zu steuern, sondern mehr um das automatische handling. Also wenn ich eine schlechte Abfrage über 5 Tabellen habe die 5 minuten läuft, dann möchte ich, dass die zweite Abfrage, die gleichzeitig ganz andere Tabellen abfragt, nicht darunter leidet.
                      Verwendest du MyIsam?

                      Kommentar


                      • #12
                        Verwendest du MyIsam?
                        Es wird sowohl MyIsam als auch InnoDB genutzt, frag mich nicht wieso und weshalb, dafür bin ich nicht verantwortlich.

                        Kommentar


                        • #13
                          Wärs vielleicht möglich eine Logik einzubauen (PHP-seitig), die vor jedem Query alle Prozesse abfragt die, den Timeout überschritten haben und diese dann killt? Um anschließend dein eigenes SQL abzufeuern?
                          "My software never has bugs, it just develops random features."
                          "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                          Kommentar


                          • #14
                            Man er ihm geht es doch nicht um die Querys die zu lange dauern. Die sollen ja gar nicht abgebrochen werden. Es geht darum dass diese einfach nicht andere Querys einschränken sollen.

                            Kommentar

                            Lädt...
                            X