2009-06-11 1 views
0

ich wissen muß, wenn es ein bester Weg, diese Art von DB-Modell zu optimieren:Allgemeine SQL Modelloptimierung Frage (MySql)

Hier sind meine Tabellen:

[category] 
idCategory 
name 

[postCategory] (a post can be in more than 1 category) 
idCategory 
idPost 

[post] 
idPost 
post 

[comment] 
idComment 
idPost 
inputDate 
comment 

Ich werde haben, Zeigen Sie alle Beiträge einer bestimmten Kategorie innerhalb eines bestimmten Zeitraums an (die Zeit stammt von "Kommentaren"). Der Zeitbereich ist fest (1 Tag, 1 Woche, 1 Monat, 1 Jahr). Hier ist, was ich kam mit:

SELECT DISTINCT(post.idPost), post.post 
from post 
INNER JOIN comment ON post.idPost = comment.idPost 
INNER JOIN postCategory ON postCategory.idPost = post.idPost 
WHERE postCategory.idCategory = <myCategoryId> 
    AND comment.inputDate >= <today - time range> 

Lassen Sie sagen, dass ich wünschte, 10k Beiträge und 500k Kommentare zu unterstützen ... Gibt es eine Möglichkeit, dies zu optimieren (außer Verwendung von Indizes)? Würden Sie eine gespeicherte Prozedur, eine Abfrage mit temporären Tabellen verwenden, fügen Sie "vorberechnete" Felder irgendwo hinzu ...?

Vielen Dank! :)

+0

FWIW, Ihre Verwendung von DISTINCT (post.idPost) weist auf ein häufiges Missverständnis hin, dass DISTINCT nur für eine Spalte gilt. Das ist falsch - es gilt immer für das gesamte Tupel, das von der Auswahlliste zurückgegeben wird, egal ob Sie Klammern verwenden oder nicht. Das hängt nicht mit Ihrer Frage zusammen, es ist nur ein FYI. –

Antwort

0

Ich würde Ihre <today - time range> Teil-Client-Seite berechnen, bevor Sie sogar mit der Datenbank verbinden.

Darüber hinaus hängt es davon ab, welche Indizes Sie haben, welche Auslastung Ihr Server hat (was im Cache zwischengespeichert wird) und wie viele Daten in jeder Tabelle (wie viele Kommentare pro typischem Post, wie viele Beiträge) pro Kategorie usw.). Mit anderen Worten, Sie müssen Profil. Vorausgesetzt, all das ist falsch (das ist es nicht!), Sollte ein anständiger Abfrageoptimierer in der Lage sein, sich um etwas anderes zu kümmern.

Es gibt ein paar Dinge, die ich aus Gewohnheit anders machen würde, aber sie sollten in diesem Fall keine Rolle spielen, ohne Ihr System mehr zu kennen. Der wichtigste ist jedoch, dass ich über die Lautstärke nachdenken würde.

Im Allgemeinen möchte ich meine Abfragen so ausdrücken, dass, wenn die Verknüpfungen der Reihe nach ausgeführt werden, die Ergebnismenge so klein wie möglich für so lange wie möglich gehalten wird. In diesem Fall würde das wahrscheinlich bedeuten, die postCategory Verknüpfung über die comments Verknüpfung aufzulisten und die "= <MyCategoryID>" Bedingung zu verschieben, um Teil des Join-Ausdrucks zu sein.

+0

Mmm ok .. Ist es eine gute Idee, das Modell mit Dummy-Daten zu testen, die von einem automatischen Skript oder etwas eingefügt werden? Oder könnte ich einfach nur andere Ergebnisse aus realen Daten bekommen? – mrmuggles

+0

Dummy-Daten sind besser als keine Daten, vor allem, wenn Sie einigermaßen sicher sein können, dass dies etwas repräsentativ für die tatsächlichen Daten ist. –

+0

Ich werde es versuchen und etwas Hilfe fragen, wenn ich ein Problem sehe. Vielen Dank! – mrmuggles