Speichern von Mikrosekunden in MySQL: die Abhilfe?
-
20-09-2019 - |
Frage
Wir sind ein wissenschaftliches Werkzeug mit MySQL-Unterstützung zu schreiben. Das Problem ist, wir mikrosekundengenau für unsere Datetime-Felder benötigen, die MySQL unterstützt derzeit keine. Ich sehe mindestens zwei Abhilfen hier:
- eine Dezimalzahl () Spaltentyp Verwendung mit ganzzahligen Teil seit einem bestimmten Zeitpunkt auf Sekunden entspricht (I bezweifeln, dass UNIX-Epoche tun wird, da wir zum Speichern von Messungen in 60 und 50er Jahren genommen haben).
- Verwenden von zwei Integer-Spalten, eine für Sekunden, die andere für Mikrosekunden.
Die populärste Abfrage Spalten entsprechend einem Zeitintervall der Auswahl (d.h. dt_record> time1 und dt_record Welche dieser Methoden (oder vielleicht ein anderes) ist wahrscheinlich eine bessere Leistung im Falle von großen Tabellen (in Millionen Zeilen) zur Verfügung zu stellen?
Lösung
Wenn Sie sagen, dass die beliebtestenen Abfragen sind Zeitbasis, Ich würde mit einer einzigen Spalte recomend gehen, dass speichert die Zeit, als in Ihrer ersten Option .
Sie können Ihre eigene Epoche für die Anwendung auszuwählen, und von dort aus arbeiten.
Dies sollte die Abfragen vereinfachen, dass Bedürfnisse geschrieben werden, wenn für die Zeitintervalle zu suchen.
Haben Sie auch einen Blick auf 10.3.1. Die DATETIME-, DATE und TIMESTAMP-Typen
Allerdings Mikrosekunden können nicht gespeichert werden in eine Spalte von jeder temporale Daten Art. Jeder Mikrosekunden Teil ist verworfen. Die Umwandlung von TIME oder Datums- und Uhrzeitwerte in numerischer Form (für beispielsweise durch Zugabe von +0) zu einem Doppel Wert mit einem Mikrosekunde Teil von 0,000000
Andere Tipps
MySQL Mikrosekunden unterstützen, finden Sie MySQL 5.6 0,4 Changelog :
Fractional Sekunden Handhabung
Inkompatible Änderung: MySQL jetzt Sekundenbruchteile für die Zeit erlaubt, DATETIME-, und Zeitstempelwerte mit bis zu Mikrosekunden (6-stellig) Präzision. Zu definieren, eine Spalte, die einen Bruchteil Sekunden umfasst, die Syntax type_name (FSP), wobei type_name der Zeit ist, DATETIME- oder TIMESTAMP und fsp ist die Sekundenbruchteile Präzision. Zum Beispiel:
CREATE TABLE t1 (t Zeit (3), dt DATETIME- (6)); Der FSP-Wert, falls gegeben, muss im Bereich von 0 bis 6. Ein Wert von 0 bedeutet, dass es keine ist Bruchteil. Wenn nicht angegeben, ist die Standardgenauigkeit 0. (Dies unterscheidet sich von dem Standard-SQL-Standardwert von 6, um die Kompatibilität mit früheren MySQL-Versionen.)
Die folgenden Punkte fassen die Auswirkungen dieser Änderung. Sehen auch Abschnitt 10.3.5, „Fractional Sekunden in Zeitwerte“.
Wie wäre es Splitting die Datumsteile in ein Datums nur ein Teil, und Mikrosekunden ab Mitternacht? Es gibt weniger als 2 ^ 64 Mikrosekunden in dem Tag. Dann Cluster in der Tabelle auf {date, Mikrosekunde}.
Ich würde vermuten, obwohl ich Ihre Daten nicht wissen, dass bestimmte Abfragen fein mit Tag-Level-Genauigkeit wären - Experimente im Jahr 1964 'muss nicht Sorgen um Mikrosekunden.