Ankündigung

Einklappen
Keine Ankündigung bisher.

Mysql Geschwindigkeit

Einklappen

Neue Werbung 2019

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

  • Mysql Geschwindigkeit

    Hallo Zusammen!
    Ich habe eine Kundenliste erstellt. Name, Tel, Email usw…
    Nun sind es im Laufe der Zeit bis zu 500 000 Datensätze daraus geworden. Jetzt habe ich das Problem, dass der Server sehr langsam oder gar nicht reagiert. Insgesamt habe ich ca. 10 Tabellen in meiner Datenbank, die alle zusammen ca. 2 Millionen Datensätze haben.

    Ich habe folgende Fragen:

    Ist die Geschwindigkeit von Mysql abhängig von der Menge der Daten in der Datenbank, oder nur abhängig von der Menge der Daten der angesprochenen Tabelle?

    Ich bin Kunde bei Strato. Würde das mieten von einem eigenen Server das Problem beheben? Habt Ihr vielleicht mit anderen Providern gute Erfahrungen gemacht?

    Wie kann ich das Problem mit den Time Out beheben, damit meine Scripte komplett ausgeführt werden?

    Ist Mysql überhaupt dafür geeignet?

    Ich bin euch sehr dankbar für jeden Tipp.

    Gruss Juan

  • #2
    Mysql Geschwindigkeit

    Hallo Zusammen!
    Ich habe eine Kundenliste erstellt. Name, Tel, Email usw…
    Nun sind es im Laufe der Zeit bis zu 500 000 Datensätze daraus geworden. Jetzt habe ich das Problem, dass der Server sehr langsam oder gar nicht reagiert. Insgesamt habe ich ca. 10 Tabellen in meiner Datenbank, die alle zusammen ca. 2 Millionen Datensätze haben.

    Ich habe folgende Fragen:

    Ist die Geschwindigkeit von Mysql abhängig von der Menge der Daten in der Datenbank, oder nur abhängig von der Menge der Daten der angesprochenen Tabelle?

    Ich bin Kunde bei Strato. Würde das mieten von einem eigenen Server das Problem beheben? Habt Ihr vielleicht mit anderen Providern gute Erfahrungen gemacht?

    Wie kann ich das Problem mit den Time Out beheben, damit meine Scripte komplett ausgeführt werden?

    Ist Mysql überhaupt dafür geeignet?

    Ich bin euch sehr dankbar für jeden Tipp.

    Gruss Juan

    Kommentar


    • #3
      Hi,

      Eine Datenbank sollte mit solchen Mengen trotzdem noch flott die Ergebnismenge berechnen. Wenn aber Datentypen und Datenstruktur schlecht sind und die Abfragen unperformant geschrieben sind, dann muss natürlich mit Leistungsverlust gerechnet werden.

      Ich kenne mich mit Strato Servern nicht aus. Teilst du dir den Server mit anderen? Dann ist da natürlich auch Verlustpotenzial gegeben.
      Bevor du es mit einem eigenen Server versuchst, würde ich das Ganze auf deinem System probieren. Ziehe dir alle Datensätze runter mache einen Testlauf. Wenn es bei dir nicht besser wird, hilft ein neuer Server nicht (vorausgesetzt dein PC ist in etwa so schnell wie dein Server, oder schneller).
      Bei PHP Skripten kann man die Ausführungszeit erhöhen. Wie genau der Wert in der PHP Konfiguration heißt weiß ich jetzt nicht (max execution time?). Eventuell hilft das bei dem Time-Out Problem.

      Gruß Thomas

      Kommentar


      • #4
        Sorry,
        aber wenn Du 500000 Kundendatensätze hast, dann solltest Du auch eine belastbare Lösung haben.
        Heisst das Gesamtpaket sollte stimmen. Deine Beschreibung hört sich an wie ein Riesenunternehmen mit massig Kunden und das Geschäft basiert auf einem WebPaket von Strato und einer gestrickten Lösung.
        Das solltest Du echt auf solide und professionelle Füsse heben...

        Kommentar


        • #5
          Wir sind eine kleine Redaktion die Urlaubsmagazine erstellt. Das Internet ist nur ein Nebenbereich bei uns. Bei Messebesuche bekommen wir die Informationen der Personen. So habe wir in laufe des zeit eine Liste von Kontaktdaten zusammengestellt, die nach Interessen sortiert werden können. Z.B.: Familienurlaub, Wellnessurlaub, usw.

          Ich arbeite an eine Möglichkeit wie man gezielt über Emails Informationen über Urlaubsangebote sendet.

          Ok! Alle Scripte habe ich selber gemacht, ich bin Autodidakt. Mit Sicherheit sind diese auch verbesserungsfähig.

          Hier ist ein Beispiel wo der Server sich total aufhängt. Hiermit erstelle ich eine liste von Personen an den ich ein Newsletter senden möchte.


          $sql="
          INSERT INTO DB_newsletter (status, anrede , name , vorname , strasse , plz , ort , email , tel , geburtsdatum , quelle , interesse , time)
          SELECT status, anrede , name , vorname , strasse , plz , ort , email , tel , geburtsdatum , quelle , interesse , time
          FROM DB_user_ok
          WHERE status = $status and email !=''
          and interesse like '%$interesse%'
          ";

          mysql_query($sql);


          Kennst du Anbieter die dafür geeignet sind?
          Oder Literatur bei den man Mysql richtig lernen kann um solche Projekte zu realisieren?

          Kommentar


          • #6
            Wir sind eine kleine Redaktion die Urlaubsmagazine erstellt. Das Internet ist nur ein Nebenbereich bei uns. Bei Messebesuche bekommen wir die Informationen der Personen. So habe wir in laufe des zeit eine Liste von Kontaktdaten zusammengestellt, die nach Interessen sortiert werden können. Z.B.: Familienurlaub, Wellnessurlaub, usw.

            Ich arbeite an eine Möglichkeit wie man gezielt über Emails Informationen über Urlaubsangebote sendet.

            Ok! Alle Scripte habe ich selber gemacht, ich bin Autodidakt. Mit Sicherheit sind diese auch verbesserungsfähig.

            Hier ist ein Beispiel wo der Server sich total aufhängt. Hiermit erstelle ich eine liste von Personen an den ich ein Newsletter senden möchte.


            $sql="
            INSERT INTO DB_newsletter (status, anrede , name , vorname , strasse , plz , ort , email , tel , geburtsdatum , quelle , interesse , time)
            SELECT status, anrede , name , vorname , strasse , plz , ort , email , tel , geburtsdatum , quelle , interesse , time
            FROM DB_user_ok
            WHERE status = $status and email !=''
            and interesse like '%$interesse%'
            ";

            mysql_query($sql);


            Kennst du Anbieter die dafür geeignet sind?
            Oder Literatur bei den man Mysql richtig lernen kann um solche Projekte zu realisieren?

            Kommentar


            • #7
              mal ne Frage warum machst Du dieses Insert? Du kopierts Daten von a nach b und erzeugst erstmal nur eine redundanz

              Kommentar


              • #8
                Da fragst du was! Redundanz?
                Das ist die Lösung die ich online gefunden habe.
                Wie wurdest du das machen?

                Kommentar


                • #9
                  ich will daten von a nach b Kopieren!

                  Kommentar


                  • #10
                    na referenzieren...

                    Kommentar


                    • #11
                      Hi,

                      An dieser Stelle liest du einfach die Kunden aus, denen du den Newsletter schicken willst (machst du ja) und sendest ihn auch direkt an diese. Dadurch das du die kompletten Daten doppelts, bekommst du eine Menge Probleme, von Performance bis zu inkonsistenten Einträgen.

                      Redundanz bedeutet, dass du die Daten mehrmals in der DB hinterlegst. Dieses Problem umgeht man durch normalisieren der Tabellen.

                      Wenn du wirklich (das ist die Frage) Daten "doppeln" musst, dann speicherst du nur noch den primary key des Datensatzes in der anderen Tabelle.

                      Gruß Thomas

                      Kommentar


                      • #12
                        Ich will Daten von a nach b Kopieren. Denn ich nehme Kontakte aus mehreren Tabellen. Damit erzeuge ich zuerst eine Tabelle mit den Kontakten an denn ich ein Mail senden will.

                        Das habe ich auch deshalb gemacht, weil das time out vom Server Probleme macht.
                        Natürlich habe ich zuerst versucht direkt zu lesen und senden:


                        $sql = "SELECT * FROM DB_user_ok WHERE status = $status and email !=''
                        and interesse like '%$interesse% ";
                        $result = mysql_query($sql);
                        while($row = mysql_fetch_object($result)){

                        /* NEWSLETTER SENDEN AN $row->email */

                        }

                        Doch das Time out macht Probleme. Es wurden maximal 1000 Mails gesendet. Also habe ich folgendes gemacht. Ich erzeuge eine Tabelle „DB_newsletter“ bei der ich sende und lösche.



                        $sql="
                        INSERT INTO DB_newsletter (status, anrede , name , vorname , strasse , plz , ort , email , tel , geburtsdatum , quelle , interesse , time)
                        SELECT status, anrede , name , vorname , strasse , plz , ort , email , tel , geburtsdatum , quelle , interesse , time
                        FROM DB_user_ok
                        WHERE status = $status and email !=''
                        and interesse like '%$interesse%'
                        ";

                        mysql_query($sql);




                        $sql = "SELECT * FROM DB_newsletter ";
                        $result = mysql_query($sql);
                        while($row = mysql_fetch_object($result)){

                        /* NEWSLETTER SENDEN AN $row->email */

                        $sql_adress = "DELETE FROM DB_newsletter WHERE id = ".$row->id." ";
                        mysql_query($sql_adress);

                        }

                        Die Lösung hat mir nie gefallen, doch ich habe kein besseres!

                        was denkt ihr dazu?

                        Kommentar


                        • #13
                          Du kannst doch mehrere Tabellen mit JOIN verknüpfen.

                          Lies dir mal dafür diese Seite hier durch. Damit hast du keine redundanten Daten.

                          MySQL :: MySQL 5.1 Referenzhandbuch :: 13.2.7.1 JOIN

                          Benutz doch einfach diese Abfrage zum verschicken des Newsletters. Dass du alles in eine andere Tabelle kopierst die du nach dem Verschicken wieder löschst, macht überhaupt keinen Sinn. Also lass den Kram einfach weg.
                          Code:
                          SELECT
                            status
                               ,anrede
                               ,name
                               ,vorname
                            ,strasse
                            ,plz
                            ,ort
                            ,email
                            ,tel
                            ,geburtsdatum
                            ,quelle
                            ,interesse
                            ,time
                          FROM
                            DB_user_ok
                          WHERE
                            status = $status
                            AND email !=''
                            AND interesse like '%$interesse%';
                          Und nimm die Spalten die du nicht brauchst aus der SELECT-Anweisung heraus. Ich denke du brauchst doch bestimmt nur anrede, name, vorname, email und interessen, oder? Dann sieht das so aus:

                          Code:
                          SELECT
                            anrede
                            ,name
                            ,vorname
                            ,email
                            ,interesse
                          FROM
                            DB_user_ok
                          WHERE
                            status = $status
                            AND email !=''
                            AND interesse like '%$interesse%';
                          Sprich dein ganzes Skript sieht so aus:

                          Code:
                          $sql = " SELECT anrede,name,vorname,email,interesse FROM DB_user_ok WHERE status = $status AND email !='' AND interesse LIKE '%$interesse%'";
                          $result = mysql_query($sql);
                          while($row = mysql_fetch_object($result))
                          {
                            /* NEWSLETTER SENDEN AN $row->email */
                          }
                          Das sollte vollkommen ausreichen.

                          Kommentar


                          • #14
                            Dein Timeout liegt aber daran dass der Server so lange braucht die mails zu verschicken. Das ist ein allgemein bekanntes problem.

                            Ich würde auf jeden fall auf redundanzen verzichten.

                            Versuch doch mal folgenden Ablauf:
                            1. Du holst alle kundendaten deren primarykey nicht in deiner tabelle aus 3. steht mit limit 1000
                            2. Wenn kein Datensatz gefunden wird brichst Du ab und gibst eine Erfolgsmeldung aus
                            3. Du sendest den 1000 Kunden den Newsletter und speicherst den primarykey des Kunden an den Du den newsletter verschickt hast in einer Tabelle ab
                            4. Du beginnst wieder bei 1. mittels header auf das gleiche Script

                            wenn das nicht funktioniert und immer noch in einen timeout läuft kannst Du mal mit 500 Kunden testen.

                            Ich gehe davon aus, dass Dein newsletter personalisiert st ansonsten kannst Du auch alle emails in BCC setzen und eine email senden...

                            Kommentar


                            • #15
                              Danke!
                              Das ist natürlich eine viel elegantere Lösung.
                              Ich werde versuchen es umzusetzen. Außer das mit den header! Was soll ich da machen?
                              Soll die datei sich wieder aufrufen nach z.B.: 30 sekunden?
                              Ich hätte das über Javascript gesteuert!

                              Noch was zu redundanz:

                              Ist das einfach nur Unschön, oder beeinflusst das die Geschwindigkeit meiner Datenbank?

                              Gruß juan

                              Kommentar

                              Lädt...
                              X