2009-03-02 10 views
6

Ich arbeite an einem Projekt, das der Website-Besucheranalyse ähnelt. Es wird von 100 Websites mit durchschnittlich 10.000 bis 100.000 Seitenaufrufen pro Tag verwendet werden, so dass die Datenmenge sehr groß sein wird.MySQL Tabellenstruktur - eine sehr große Tabelle oder separate Tabellen?

Sollte ich eine einzelne Tabelle mit WebsiteID oder eine separate Tabelle für jede Website verwenden?

Änderungen an einem Live-Service mit 100 Websites mit separaten Tabellen für jeden scheint ein großes Problem. Auf der anderen Seite werden Leistung und Skalierbarkeit wahrscheinlich ein Problem mit solch großen Daten sein. Anregungen, Kommentare oder Ratschläge sind herzlich willkommen.

Antwort

8

Wie wäre es mit einer Tabelle partitioned von Website FK?

+0

Ich sage nur, dass ich damit einverstanden bin, horizontale Partitionierung auf PK/FK. – thr

+0

Danke, ich überprüfe diese Option – Nir

1

Ich würde sagen, verwenden Sie das Design, das am meisten Sinn macht angesichts Ihrer Daten - in diesem Fall eine große Tabelle.

Die Datensätze sind alle vom selben Typ, mit den gleichen Spalten, daher ist es aus Sicht der Datenbanknormalisierung sinnvoll, sie in derselben Tabelle zu haben. Ein Index erleichtert das Auswählen bestimmter Zeilen, besonders wenn ganze Abfragen von Daten in einem einzigen Index erfüllt werden können (was oft der Fall sein kann).

Beachten Sie, dass die Besucheranalyse eine Vielzahl von Vorgängen erfordert, bei denen es keine einfache Möglichkeit gibt, andere zu optimieren, als auf einer großen Anzahl von Zeilen gleichzeitig zu arbeiten - z. B. Zählungen, Summen und Durchschnitte. Es ist typisch, dass ressourcenintensive Statistiken wie diese vorberechnet und gespeichert werden und nicht live abgerufen werden. Es ist etwas, über das du nachdenken möchtest.

+0

Danke! kennt jemand einen guten Ort, um über solche Systeme und ihre Architektur zu lesen? – Nir

+0

Nun, StackOverflow kann ziemlich gut sein, wenn Sie ein wenig suchen wollen. Auch mysqlperformanceblog.com Ich denke, ist gut, obwohl Sie wieder ein wenig suchen müssen. Schwer zu empfehlen, du könntest versuchen, eine andere Frage zu stellen, denke ich. – thomasrutter

1

Wenn die Daten einheitlich sind, gehen Sie mit einer Tabelle. Wenn Sie jemals auf allen Websites WÄHLEN müssen mit mehreren Tabellen ist ein Schmerz. Wenn Sie jedoch genug Skripts schreiben, können Sie dies mit mehreren Tabellen tun.

Sie könnten die MERGE-Speicher-Engine von MySQL verwenden, um SELECTs in den Tabellen durchzuführen (aber erwarten Sie keine gute Leistung und achten Sie auf die harte Windows-Grenze für die Anzahl geöffneter Dateien - in Linux müssen Sie möglicherweise ulimit verwenden das Limit. Es gibt keine Möglichkeit, dies in Windows zu tun).

Ich habe eine riesige Tabelle in viele (Hunderte) von Tabellen aufgeteilt und MERGE zu SELECT verwendet. Ich tat dies, damit ich die einzelnen Tabellen erstellen und optimieren konnte. (ZB OPTIMIZE oder ALTER TABLE ... ORDER BY). Die Leistung von SELECT mit MERGE hat mich jedoch dazu veranlasst, meine eigene benutzerdefinierte Speicher-Engine zu schreiben. (Beschrieben http://blog.coldlogic.com/categories/coldstore/'> hier)

0

Verwenden Sie eine Tabelle, wenn Sie Leistungsprobleme mit MySQL haben.

Niemand hier kann keine Leistungsfragen beantworten, Sie sollten nur Leistungstests durchführen, um zu verstehen, ob es ausreicht, einen großen Tisch zu haben.

1

Verwenden Sie die einzelne Datenstruktur. Sobald Sie mit Leistungsproblemen zu kämpfen haben, gibt es viele Lösungen, wie Sie Ihre Tabellen nach der Website-ID partitionieren können, die auch als horizontale Partitionierung bezeichnet wird, oder Sie können auch die Replikation verwenden. Dies hängt alles von dem Verhältnis von Lesevorgängen zu Schreibvorgängen ab.

Aber für Start halten Sie die Dinge einfach und verwenden Sie eine Tabelle mit der richtigen Indizierung. Sie können auch bestimmen, ob Sie Transaktionen benötigen oder nicht. Sie können auch verschiedene mysql-Speicher-Engines wie MyIsam oder NDB (im Speicher-Clustering) nutzen, um die Leistung zu steigern. Auch das Caching spielt eine sehr gute Rolle beim Entladen der Last von der Datenbank.Die Daten, die meistens nur gelesen werden und leicht berechnet werden können, werden normalerweise in den Cache gestellt, und der Cache bedient die Anfrage, anstatt zur Datenbank zu gehen, und nur die notwendigen Abfragen gehen zur Datenbank.

Verwandte Themen