Mikrosekunden in MySQL speichern: welche Abhilfe?

8

Wir schreiben ein wissenschaftliches Tool mit MySQL-Unterstützung. Das Problem ist, wir brauchen Mikrosekundengenauigkeit für unsere Datetime-Felder, die MySQL derzeit nicht unterstützt. Ich sehe hier mindestens zwei Problemumgehungen:

  • Verwendung eines decimal () Spaltentyps, wobei der ganzzahlige Teil den Sekunden seit einem bestimmten Zeitpunkt entspricht (Ich bezweifle, dass UNIX-Epochen dies tun, da wir Messungen in den 60ern und 50ern speichern müssen).
  • Verwenden von zwei Ganzzahlspalten, eine für Sekunden, die andere für Mikrosekunden.

Die populärste Abfrage wählt Spalten aus, die einem Zeitintervall entsprechen (d. h. dt_record & gt; time1 und dt_record & lt; time2).

Welche dieser Methoden (oder vielleicht eine andere) bietet wahrscheinlich eine bessere Leistung bei großen Tabellen (Millionen von Zeilen)?

    
dpq 13.02.2010, 11:37
quelle

3 Antworten

4

Wenn Sie sagen, dass die beliebtesten Abfragen Zeitbasis sind, würde ich empfehlen, mit einer einzelnen Spalte zu gehen, die die Zeit wie in Ihrer ersten Option speichert .

Sie könnten Ihre eigene Epoche für die Anwendung auswählen und von dort aus arbeiten.

Dies sollte die Abfragen vereinfachen, die beim Suchen nach Zeitintervallen geschrieben werden müssen.

Sehen Sie sich auch 10.3.1 an. Die Typen DATETIME, DATE und TIMESTAMP

  

Allerdings können Mikrosekunden nicht gespeichert werden   in eine Spalte mit beliebigen zeitlichen Daten   Art. Jeder Mikrosekunde Teil ist   verworfen. Umwandlung von TIME oder   DATETIME-Werte in numerischer Form (für   Beispiel, indem Sie +0) hinzufügen, ergibt a   Doppelter Wert mit einem Mikrosekunden-Anteil   von .000000

    
Adriaan Stander 13.02.2010, 11:45
quelle
5

MySQL unterstützt Mikrosekunden, siehe MySQL 5.6.4 changelog :

  

Bruch Sekunden Behandlung

     

Inkompatible Änderung: MySQL erlaubt jetzt Bruch Sekunden für TIME,   DATETIME- und TIMESTAMP-Werte mit bis zu Mikrosekunden (6 Ziffern)   Präzision. Um eine Spalte zu definieren, die einen Sekundenbruchteil enthält,   Verwenden Sie die Syntax type_name (fsp), wobei type_name für TIME, DATETIME oder steht   TIMESTAMP und fsp ist die Sekundenbruchteile-Genauigkeit. Zum Beispiel:

     

CREATE TABLE t1 (t ZEIT (3), dt DATENZEIT (6)); Der fsp-Wert, falls angegeben,   muss im Bereich von 0 bis 6 liegen. Ein Wert von 0 bedeutet, dass es keine gibt   Bruchteil. Wenn nicht angegeben, ist die Standardgenauigkeit 0. (Dies ist unterschiedlich   von der Standard-SQL-Standard von 6, für die Kompatibilität mit vorherigen   MySQL-Versionen.)

     

Die folgenden Punkte fassen die Auswirkungen dieser Änderung zusammen. Sehen   auch Abschnitt 10.3.5, "Sekundenbruchteile in Zeitwerten".

    
amra 13.03.2012 09:59
quelle
0

Wie wäre es, die Datumsteile in einen Nur-Datum-Teil und Mikrosekunden von Mitternacht aufzuteilen? Es gibt weniger als 2 ^ 64 Mikrosekunden am Tag. Dann clustern Sie die Tabelle am {date, microsecond}.

Ich schätze, obwohl ich Ihre Daten nicht kenne, dass bestimmte Abfragen mit der Genauigkeit des Tagesablaufs in Ordnung sind - "Experimente im Jahr 1964" müssen sich keine Sorgen über Mikrosekunden machen.

    
Steve Cooper 13.02.2010 11:55
quelle