Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP Mysql CPU zu hoch wie opimiere ich das

Einklappen

Neue Werbung 2019

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

  • PHP Mysql CPU zu hoch wie opimiere ich das

    Hallo,

    ich habe bemerkt das die CPU zu weit ansteigt, weil in meinem Code mehrmals durch for schleifen in die Mysql Datenbank Daten geschrieben werden.

    Ich dachte jetzt vielleicht kann man das optimieren indem man nur einmal alles in die Mysql Tabelle speichern mit einem einizgen Befehl, zum Beispiel erst alle INSERT INTO Befehle in eine Textdatei speichern und dann diese Textdatei mit dem SQl Codes ausfuehren lassen.

    Hat jemand Erfahrungen mit solchen Sachen und kann mir sagen ob das moeglich ist oder hat jemand sonstige Ideen wie man das optimieren kann?

    Mein erster Versuchen eben mit "mysqli_multi_query" zu arbeiten hat auch nicht so gut geklappt, da kommen irgendwie zu viele Fehlermeldungen, ich glaube am besten waere wenn man jeweils eine sql datei erstellt welche dann ausgeufhert wird.

  • #2
    Naja, kein MySQL zu verwenden wäre immer ein guter Tipp. MySQL kommt schnell an seine Grenzen.

    Aber es fehlen relevante Informationen zu deinem Problem. Welche Version, welche Engine, welche Struktur, welche Indexe, mit/ohne Transaktion, wieviele Datensätze, welche Datenmenge, usw. usf. Natürlich spielt auch die Hardware eine Rolle. Wenn die Daten auf SSDs liegen, funktionieren Datenzugriffe natürlich wesentlich flotter also auf HDDs. Ein RAID kann Schreibzugriffe übrigens auch ordentlich ausbremsen. Auch ein Virenscanner kann die Schreibleistung stark reduzieren. Ebenso Verschlüsselungen.

    Es gibt so viele Unbekannte, die hier reinspielen können.

    Kommentar


    • #3
      Also generell ist alle auf einem Windows 2012 VPS Server installiert und wenn man mal bestimmte Hardware Fragen aussen vor laest, gibt es den irgendwelche gute Optimierungs Tricks?

      Z.B. wir haben ein for schleife mit 1000 Udrehungen, bei jeder Umdrehung kann man entweder eine mysql Insert Abfrage senden, also 1000 mal insert, dann kommen die Daten sicher rein in die Datenbank, oder man kann nur einmal eine Mysql Abfrage machen und zwar indem man in der for Schleife die Daten in ein String sammelt und dann am Ende einmal alles sendet. Das probiere ich z.b; zur Zeit sauber hin zu bekommen.

      Ich habe uebrigens auch gelesen das Leute sagen am besten benutzt man gar keine Datenbank, wie siehst du das denk, gibt es andere kostenlose oder guenstige Loesungen zu Mysql die auch besser funktionieren?

      Kommentar


      • #4
        Zitat von phpdeuser Beitrag anzeigen
        Z.B. wir haben ein for schleife mit 1000 Udrehungen, bei jeder Umdrehung kann man entweder eine mysql Insert Abfrage senden, also 1000 mal insert, dann kommen die Daten sicher rein in die Datenbank, oder man kann nur einmal eine Mysql Abfrage machen und zwar indem man in der for Schleife die Daten in ein String sammelt und dann am Ende einmal alles sendet. Das probiere ich z.b; zur Zeit sauber hin zu bekommen.
        Oder man könnte Prepared Statements verwenden. Diese sind schon mal schneller als viele einzelne INSERT-Abfragen.

        Zitat von phpdeuser Beitrag anzeigen
        Ich habe uebrigens auch gelesen das Leute sagen am besten benutzt man gar keine Datenbank
        Sondern was?

        Zitat von phpdeuser Beitrag anzeigen
        wie siehst du das denk, gibt es andere kostenlose oder guenstige Loesungen zu Mysql die auch besser funktionieren?
        PostgreSQL

        Kommentar


        • #5
          Ich dachte jetzt vielleicht kann man das optimieren indem man nur einmal alles in die Mysql Tabelle speichern mit einem einizgen Befehl, zum Beispiel erst alle INSERT INTO Befehle in eine Textdatei speichern und dann diese Textdatei mit dem SQl Codes ausfuehren lassen.
          https://www.webhostone.de/faq-mysql-...n-mit-ssh.html

          Kommentar


          • #6
            ich habe bemerkt das die CPU zu weit ansteigt
            Das sollte kein Massstab sein.

            Lediglich die Zeit die benötigt wird ist entscheidend, sowie die Häufigkeit, des neu Einfügens. Es ist schon ein Unterschied ob ich das einmalig mache oder regelmässig zu jeder Stunde.

            Du hast aber viele wichtige Fragen aus #2, wie, welche Engine, welche Struktur, welche Indexe, mit/ohne Transaktion, gar nicht beantwortet.

            Mein erster Versuchen eben mit "mysqli_multi_query" zu arbeiten hat auch nicht so gut geklappt, da kommen irgendwie zu viele Fehlermeldungen,
            Ist immer wieder super zu lesen, dass du die Fehlermeldungen kennst, wir aber ins Bleuae raten sollen, was du da machst.

            Zeige Code, Zeige Fehlermeldungen und zeige die Struktur deiner Tabelle, damit man sich ein Bild machen kann.

            Kommentar


            • #7
              Zitat von phpdeuser Beitrag anzeigen
              oder man kann nur einmal eine Mysql Abfrage machen und zwar indem man in der for Schleife die Daten in ein String sammelt und dann am Ende einmal alles sendet. Das probiere ich z.b; zur Zeit sauber hin zu bekommen.
              Den Weg über sogenannte "insert multiple rows" solltest du weiter verfolgen!

              Mit Prepared Statements lässt sich auch für Inserts die Performance steigern, aber nicht in der Größenordnung von "insert multiple rows".

              Für eine PDO-Klasse habe ich hier einen Echtzeittest gegen eine MySQL-DB laufen, der für einzelne Operationen auch die Zeiten zeigt.
              Hier wird für eine einzelne Zeile ca. 3ms benötigt (Siehe nach "insert 1 row from array", Line 434), für 1024 Zeilen in einem Rutsch nur ca 30ms, was 0,03ms pro Zeile entspricht oder Faktor 100 entspricht.

              Kommentar


              • #8
                Hey Leute, mittlerweile bin ich dazue uebergegangen nur Textdateien zu benutzen in Json Format. Und die CPU Leistung ist auch niedriger als wenn ich die Datenbank benutze.
                Problem mit deb Textdateien ist das man nicht sogut neue Dateien einfuegen kann oder bearbeiten, da muss man dann irgendwie noch zu viele Funktionen benutzen und die ganze Datei irgendwie durchsuchen wenn man die gut genug bearbeiten will, was ja auch wieder Rechenleistung kostet.

                Was denkt ihr Leute, kann man mit Datenbanken das auch so hinbekommen das die CPU nicht weit ansteigt, sogut wie man das mit benutzen von Textdateien hinbekommt?

                Kommentar


                • #9
                  Oh Mann!

                  Lies dir am besten den ganzen Faden hier noch mal durch.

                  Mysql speichert die Daten auch in Dateien, wo auch sonst. Im Grunde bist du jetzt dabei die Funktionalität einer Datenbank nachzubilden.
                  Aber irgendwann wirst auch du das merken, dass das Unsinn ist.

                  Noch mal, die CPU Leistung ist kein Massstab, wenn sie auf 100% geht, dann arbeitet der Prozessor eben mit allen Ressourcen. Na und, wo ist das Problem, soll er die doppelte ZEIT benötigen, weil du dann nur 50% angezeigt bekommst oder wie denkst du dir das.

                  Kommentar


                  • #10
                    Zitat von phpdeuser Beitrag anzeigen
                    Was denkt ihr Leute, kann man mit Datenbanken das auch so hinbekommen das die CPU nicht weit ansteigt, sogut wie man das mit benutzen von Textdateien hinbekommt?
                    Naja, wenn du 90% von dem was man schreibt ignorierst, wird das wohl nix werden...

                    Kommentar


                    • #11
                      Zitat von phpdeuser Beitrag anzeigen
                      Was denkt ihr Leute, kann man mit Datenbanken das auch so hinbekommen das die CPU nicht weit ansteigt, sogut wie man das mit benutzen von Textdateien hinbekommt?
                      Um auf dem selben Level zu bleiben. Schreib ein sleep(1); in deine Schleife...

                      Kommentar


                      • #12
                        Zitat von erc Beitrag anzeigen

                        Um auf dem selben Level zu bleiben. Schreib ein sleep(1); in deine Schleife...
                        lol,
                        # renice
                        kann ein DB Import eine handelsübliche CPU überhaupt auslasten? geht das nicht eher auf die Platte ?

                        Kommentar


                        • #13
                          Hintereinander ausgeführte Inserts lasten dir i.d.R. keine CPU aus. Da sind aber zuviele unbekannte im Spiel um eine seriöse Antwort zu geben. Am Ende hat der Threadersteller ein 100GB große Tabelle mit 50 Indizies...

                          Kommentar


                          • #14
                            Zitat von phpdeuser Beitrag anzeigen
                            .. weil in meinem Code mehrmals durch for schleifen in die Mysql Datenbank Daten geschrieben werden.
                            For-Schleifen sind meist ein schlechtes Zeichen.
                            SQL bietet mit einem Konstrukt wie
                            Code:
                            insert into <table> <columnlist> values <valuelist>
                            select <field-/expressionlist> from (select ..)
                            die Möglichkeit, sehr weitgehend ohne Schleifenkonstrukte auszukommen. Damit wird dann aus einer 1000er Forschleife mit entsprechend vielen Selects, Subselect und Inserts ein einziges Statement, das sogar komplett auf dem DB Server ausgeführt wird, eine geschlossene Transaktion ohne Overhead ist und sämtlichen Datenverkehr zwischen DB und PHP spart.

                            Es lässt sich natürlich nicht alles damit erschlagen, aber sehr viel. Kommt natürlich auch ein wenig auf die Fähigkeiten der DB an.

                            Kommentar


                            • #15
                              Ja Leute wie man sieht reicht es nicht aus ein wenig PHP und Mysql zu lernen, man muss auch ein Optimierer sein.
                              Gibt es den irgendwelche tools die dabei helfen koennen heraus zu finden welche meiner mysql und php abfragen die meiste cpu kosten, dann kann ich wenigstens dort schon mal genau wissen wo ich verbessern soll?
                              Also ich benutze uebrigens XAMPP mit dem dazugehoerigen PHP and Mysql Servern. Und mein Windows VPS Server wo das ganze laeuft ist folgender: https://www.united-hoster.de/server/...r-windows.html
                              also das starter packet davon:
                              • 2 GB RAM
                              • 2 vCores
                              • 125 GB SSD Festplatte
                              • 125 GB Backup
                              und die cpu sollte zumindest auf unnter 50% bleiben am ende wenn ich alle sachen eingebaut habe, dann bin ich schon zufrieden.
                              ich lasse halt die ganze zeit ueber 150 crypto currencys downloaden und aktualissieren fuer 4 verschiedene timeframes

                              Kommentar

                              Lädt...
                              X