drdrakken: Performancefrage

Hallo!

Ich habe eine Frage zur Performance von MySQL-Abfragen.

Meine Online-Quiz-Seite kommt langsam so richtig in die Gänge und ich befürchte, daß da eine Menge Daten anfallen werden und irgendwann die Performance völlig zusammenbricht.

Es geht vor allem um 3 Tabellen:

user
answers
questions

Wenn ein User eine Frage beantwortet, dann wird in der Tabelle answers ein Datensatz angelegt in dem userid, questionid, richtig/falsch sowie ein Timestamp gespeichert werden.

Theoretisch kann jeder User jede Frage beantworten, wodurch sich die Anzahl der Datensätze natürlich aus Frageanzahl * Useranzahl ergibt. Wenn die Seite mal 5.000 User und 20.000 Fragen hat (und derzeit sieht es wirklich so aus als ob das mal passieren wird) dann hätte die Tabelle answers bis dahin 100 Millionen Datensätze. Ganz abgesehen davon, daß die Tabelle dann mehrere Gigabyte groß wird, wie wirkt sich das bei der Abfrage aus?

Natürlich wird vor jedem Anzeigen einer Frage abgefragt, welche Fragen der betreffende User noch nicht beantwortet hat, damit ihm keine Fragen mehrfach gestellt werden.

Ausserdem gibt es eine monatliche Statistik, wieviel % an richtigen Antworten jeder User in diesem Monat geschafft hat.

Derzeit läuft noch alles superschnell, aber das könnte sich bald einmal ändern, oder?

Grüsse

DrDee

  1. Hallo,

    Wenn die Seite mal 5.000 User und 20.000 Fragen hat (und derzeit sieht es wirklich so aus als ob das mal passieren wird) dann hätte die Tabelle answers bis dahin 100 Millionen Datensätze.

    Theoretisch ja - aber praktisch? Wie viele dieser 5000 User beantworten alle 20.000 Fragen? Das dürfte eher ein geringer Prozentsatz sein.

    Generell: Datenbanken sind eigentlich genau dafür gedacht, große Datenmengen unterzubringen und schnell auf sie zuzugreifen - ich glaube nicht, dass eine solche Datensatzmenge (selbst wenn es 100 Mio werden) schon ein ernstes Problem ist. Es hängt allerdings ein bisschen vom Datenbank-System ab.

    Allerdings solltest Du sicherstellen, dass Du an sinnvollen Stellen Indizes einsetzt, um die Suchanfragen schnell zu halten.

    Ebenfalls solltest Du testen, ob Deine Anfragen alle performant programmiert sind.

    Wenn trotz allen diesen Maßnahmen wirklich die Datenbank in die Knie geht, hilft noch mehr Arbeitsspeicher in den Datenbank-Server, evtl. sogar Clustering auf mehrere Datenbank-Server.

    Viele Grüße,
    Jörg

  2. yo,

    Ich habe eine Frage zur Performance von MySQL-Abfragen.

    bitte immer auch die version des dbms mit angeben.

    Wenn die Seite mal 5.000 User und 20.000 Fragen hat (und derzeit sieht es wirklich so aus als ob das mal passieren wird) dann hätte die Tabelle answers bis dahin 100 Millionen Datensätze.

    ich würde nicht davon ausgehen, dass jeder auch die 20.000 fragen beantwortet, erscheint mir unwahrscheinlich. ich würde eher ein mittel berechnen.

    Natürlich wird vor jedem Anzeigen einer Frage abgefragt, welche Fragen der betreffende User noch nicht beantwortet hat, damit ihm keine Fragen mehrfach gestellt werden.

    datenbankseitig sollte das auch mit einem Unique Constraint abgesichert werden.

    Derzeit läuft noch alles superschnell, aber das könnte sich bald einmal ändern, oder?

    grundsätzlich kann sich immer was verändern, wenn sich die daten verändern. aber partitionierung sollte dein thema sein. mysql kann das meines wissen in den aktuelleren versionen.

    Ilja

  3. hallo,

    Wie wäre es, nach bestimmter Laufzeit ein paar Fragen wieder freizuschalten und das Gesamtergebnis in einer weiteren Tabelle zu speichern?

    Nach 5 Monaten raten und 20.000x Kopfzerbrechen wird wohl das Einschieben bereits beantworteter Fragen nicht so "schlimm" sein. Mit auf Zeit basiertem Löschen kannst du auch dem entgegen wirken, die Frage von gestern wieder vorgesetzt zu bekommen.

    --
    "Sir! We are surrounded!" - "Excellent! We can attack in any direction!"