Erstellen Sie besser eine Tabelle für jedes Benutzerkonto oder eine große Tabelle für alle Benutzerdaten in MYSQL

8

Ich erstelle ein Webverzeichnis, mit dem sich einzelne Benutzer für ein Konto anmelden und im Wesentlichen Textdokumente in einem MySQL-Datenbankeintrag speichern können.

Anfangs wird es wahrscheinlich nur ein paar hundert Benutzer geben, aber wir hoffen, irgendwann 10.000 bis 100.000 zu haben. Und jeder Benutzer könnte 100-200 "Dokumente" hochladen.

Wäre es effizienter, eine massive Tabelle zu erstellen, die durch eine Benutzernummer indiziert ist? Das könnte theoretisch auf 20.000.000 Einträge anwachsen. Oder um für jeden Benutzer eine Tabelle mit seinen individuellen Dokumenten zu erstellen?

Ich gehe davon aus, dass es nicht gesund ist, Tausende von Tabellen in einer Datenbank zu haben, aber ich kann wirklich keine konkreten Daten dazu finden.

Keith
quelle

Antworten:

7

MySQL kann problemlos mit 20 Millionen Zeilen umgehen, wenn es richtig indiziert ist. Wir haben Tabellen mit mehr als einer Milliarde Zeilen.

Einen Tisch zu haben ist sauberer. Sie müssen in der Anwendung, die auf dem Benutzer (Name) basiert, keine Magie ausführen. Es ist auch einfacher, Statistiken für die Dokumententabelle zu erstellen.

Ich würde definitiv mit dem einen großen Tisch Ansatz gehen. Wenn Sie sich Gedanken über die (physische) Tabellengröße machen, sollten Sie die Dokumenttabelle partitionieren. http://dev.mysql.com/doc/refman/5.5/en/partitioning-types.html

Károly Nagy
quelle
Danke für die Antwort. Ich werde dann definitiv mit einer einzigen Tabelle arbeiten und den Partitionierungsansatz untersuchen. Eine Frage ist jedoch, was genau unter einer ordnungsgemäß indizierten Tabelle zu verstehen ist. Ich höre, dass dies häufig referenziert wird, und gehe davon aus, dass die Datenbanktabelle einen ordnungsgemäß definierten Indexschlüssel benötigt. Aber gibt es mehr als das für die beste Optimierung.
Keith
Mit richtig indiziert meinte ich, mindestens einen zusammengesetzten Index für die Benutzer-ID mit den Spalten zu haben, nach denen Sie filtern oder nach denen Sie in der Dokumenttabelle sortieren, und einen Index für den Benutzernamen in der Benutzertabelle (wahrscheinlich reicht ein Teilindex aus, um die Kardinalität 90-95 zu überprüfen % reicht). Zum Beispiel: sqlfiddle.com/#!2/9fb15/2 (In meinem Fall mit Teilindex 5 für die Kardinalität des Benutzernamens beträgt 50%)
Károly Nagy
Ich glaube ich verstehe, danke für die Hilfe. Noch eine Frage: Unter der Annahme, dass Sie für jede Tabelle einen primären Indexschlüssel haben, hilft es dennoch bei der Optimierung, zusätzliche Spalten, nach denen Sie regelmäßig suchen (z. B. übergeordnete Kategorie), als Index zu definieren? Gibt es einen Nachteil bei der Definition eines Primär- oder eindeutigen Schlüssels und von 2 bis 4 Indizes für jede Tabelle?
Keith
Indizes helfen ja. Eigentlich sollten Sie immer Indizes für die Spalten haben, nach denen Sie filtern, sonst endet die Abfrage in der vollständigen Scansuche. Der einzige Nachteil (neben der Indexgröße ) sind langsamere Einfügungen und Aktualisierungen. Da 5.1 mit dem InnoDB-Plugin und 5.5 standardmäßig MySQL eine schnelle Indexerstellung hat ( dev.mysql.com/doc/refman/5.5/en/… ), ist dies nicht der Fall ein großes Problem mehr.
Károly Nagy