2016-06-13 8 views
1

Stellen Sie sich vor, Sie haben einen Tisch POSTS mit 50 Millionen Posts. Diese Tabelle hat:Vermeiden Sie Joins oder nicht?

ID, POST, CATEGORY_ID 
1, "Hello world", 2 

Und dann haben Sie eine Tabelle Kategorien mit:

ID, CATEGORY_NAME 
1, "Football" 
2, "Baseball" 

Auf der Website listen Sie diese Beiträge in ORDER DESC, die Post und den Kategorienamen zeigt, die einen Join.

[Baseball] 
Hello World! 

Ich denke über das Hinzufügen die CATEGORY_NAME Spalte auf die BEITRäGEN Tabelle, um zu vermeiden, (wenn jemand einen neuen Beitrag erstellen) zu, dass jedes Mal machen JOIN erhalte ich einen Besuch ab.

In der Reihenfolge der Leistung, ist eine gute Idee? Stellen Sie sich vor, Sie haben täglich 10.000.000 Besucher (hoffentlich :))

Auf der anderen Seite würde ich gerne wissen, welche DB-Engine halten Sie dafür besser, mysql? Mariadb? Mongodb?

EDIT:

ein reales Szenario Stellen Sie sich vor: Ich brauche 3 POST zu zeigen, verbindet + KATEGORIE + USER_NAME.

POSTS: 50 million rows 
CATEGORIES: 100 rows 
USERS: 10 million rows 

Option A) Join zwischen den drei Tabellen zu zeigen:

[Baseball] 
Hello World 
- By John 

Option B) Hinzufügen von 2 Spalten (CAT_NAME, USER_NAME) varchar (25) Tisch, um an Beiträgen der Verbindung zu vermeiden.

+2

"Ich denke darüber nach, die Spalte CATEGORY_NAME in die POSTS-Tabelle einzufügen (wenn jemand einen neuen Beitrag erstellt), um zu vermeiden, dass ich jedes Mal, wenn ich einen Besuch erhalte, einen JOIN mache." - das würde "Denormalisierung" heißen - Wenn Sie kein Leistungsproblem gemessen haben, tun Sie es nicht. –

+2

Die Kategorietabelle klingt ziemlich klein, daher sollte der Leistungseinfluss minimal sein (im Grunde In-Memory-Hash-Lookup). Wenn es ein Problem gibt, würde ich das Caching untersuchen (insbesondere weil sich die Kategorienamen wahrscheinlich nur sehr selten ändern) vor der Denormalisierung. – Thilo

+0

Aber in der Theorie sollte es bei hohem Traffic schneller sein, oder? Ich aktualisiere Hauptpost mit einem zweiten Szenario. –

Antwort

0

Halten Sie die Dinge normalisiert.

Die Kosten des JOIN sind geringer als die Kosten, die durch einen pralleren Tisch verursacht werden. Derzeit (kleine Datenmenge) kann man nicht viel Leistungsunterschied sehen. Wenn die Tabellen zu groß sind, um sie im RAM zwischenzuspeichern, wird der Leistungsvorteil der Normalisierung deutlich.