2010-12-30 14 views
0

Datenbanktyp: mysqlDie Wahl eines Primärschlüssel, Ersatzschlüssel, Index in der mysql-Handel mit Aktien Datenbank

Spalten: Datum, Uhrzeit, price1, qty1, price2, qty2 Zeit wird in Millisekunden Anzahl der Datensätze ca. 5,5 Millionen für einen Monat.

Ich kann Datum als Primärschlüssel nicht wählen, da es nicht einzigartig ist, aber kann Datum und Zeit als kombiniert wählen, aber das ist auch keine gute Idee.

Ich werde Abfragen wie ausführen wählen Sie den Preis und die Menge zwischen "diesem Datum und Uhrzeit" und "diesem Datum und Uhrzeit" und das Ergebnis könnte in Millionen liegen.

Was könnte die beste Wahl in Bezug auf Primärschlüssel, Index und Ersatzschlüssel und was ist der beste Weg, dies zu implementieren. Wie sollte ich die Datenbank optimieren?

+1

Ihre Spalten scheinen etwas zu fehlen - alle anderen, die Sie in den Mix werfen möchten? –

Antwort

0

nicht sicher, warum Sie beide Datum sagen, die Wahl und die Zeit wäre eine schlechte Idee sein (sind Sie gegen Composite-Schlüssel?)

Ein größeres Problem für Sie, dass die Zeit Millisekunden nicht speichert. Weitere Informationen dazu finden Sie in diesem Fehler: http://bugs.mysql.com/bug.php?id=8523

Es scheint auch etwas fehlt der Schlüssel, der die Aktie wie Ticker identifiziert. Da sich der Ticker im Laufe der Zeit ändern kann, ist es eine gute Idee, ein Surrogat wie StockID einzuführen. Sie würden dies in einer Tabelle namens Stock oder ähnlich tun.

Dann würde ich für Ihre Trade-Tabelle vorschlagen StockID, Datum und Uhrzeit (aber speichern Sie die Zeit in etwas anderes als der TIME-Datentyp, so dass Sie Millisekunden speichern können. Stellen Sie eine andere Frage, wenn Sie Hilfe benötigen).

Die Reihenfolge der Schlüssel im PK ist sowohl für die Speicherung als auch für die Weiterleitung wichtig. Zum Abrufen möchten Sie zuerst die selektivsten Schlüssel für Ihre Abfrage eingeben. Wenn Sie also auf alle Daten für eine Aktie auf einmal (oder für eine Reihe von Aktien) zugreifen möchten, setzen Sie StockID zuerst, damit der Index sie schnell finden kann. Wenn Sie dazu neigen, auf alle Daten für ein bestimmtes Intervall zuzugreifen, legen Sie zuerst Date und dann Time fest.

Für die Speicherung ist es besser, anzufügen, so dass Datum und Uhrzeit zuerst hier ist eine gute Idee auch hier.

Wenn Sie hauptsächlich in Datumsbereichen zugreifen möchten, aber manchmal auch nach Stock, legen Sie einen sekundären Index auf StockID.

+0

In den Datenreihen ist kein Stockid oder ähnliches vorhanden. Die Aktien-ID wird der Dateiname sein. Ich bin mir ziemlich bewusst, dass mysql Bugs auf Timestamp hat. Ich bin immer noch zurückhaltend, Datum und Uhrzeit als Primärschlüssel zu wählen, da es Formatierungsprobleme zuerst und zweite verschiedene Zeitzonenprobleme geben wird. weil ich Daten von US/UK/Asien haben werde. Die Frage bleibt immer noch, welchen man als Primärschlüssel, Surrogat und Index über welchen wählen soll. Ich könnte auch Vergleiche basierend auf DateAndtime wie GET DATA FOR DateAndtime1> CurrentDateAndTime2. Es ist eine historische Datenbank, so dass keine Zugabe mehr. – ladz

+0

@ladz: "Die Aktien-ID wird der Dateiname sein". Was bedeutet "Dateiname"? Meinst du einen Spaltennamen? Wenn dem so ist, schlage ich vor, dass Sie Ihr Design ändern und die Bestandskennung selbst zu einer Spalte machen. Auf lange Sicht wird dies die Wartung und Abfrage vereinfachen. – sqlvogel

0

Da Sie keinen natürlichen Schlüssel haben (also nichts Einzigartiges innerhalb jeder Zeile), müssen Sie einen Ersatzschlüssel hinzufügen (aus Gründen des Arguments "transactionid"). Sie können Ihren Index immer noch basierend auf der Datumszeit (die wirklich wirklich eine einzelne Spalte sein sollte) für effizientes periodisches Scannen erstellen lassen.