Le stockage microsecondes dans MySQL: quelle solution?
-
20-09-2019 - |
Question
nous écrivons un outil scientifique avec le support de MySQL. Le problème est, nous avons besoin de précision microseconde pour nos champs datetime, qui MySQL ne prennent pas en charge. Je vois au moins deux solutions de contournement ici:
- En utilisant une décimale () type de colonne, avec une partie entière correspondant à quelques secondes depuis un moment (je doute que l'époque UNIX va faire, puisque nous devons stocker des mesures prises dans des années 60 et 50.).
- L'utilisation de deux colonnes de nombre entier, pour une seconde, l'autre pour microsecondes.
La requête la plus populaire est la sélection de colonnes correspondant à un intervalle de temps (à savoir dt_record> time1 et dt_record Laquelle de ces méthodes (ou peut-être un autre) est susceptible d'offrir de meilleures performances dans le cas des grandes tables (en millions de lignes)?
La solution
Si vous dites que les requêtes les plus populaires sont la base de temps, Je recommanderais d'aller avec une seule colonne qui stocke le temps comme dans votre première option .
Vous pouvez choisir votre propre époque pour l'application, et de travailler à partir de là.
Cela devrait simplifier les requêtes qui doit être écrite lors de la recherche des intervalles de temps.
Voir aussi 10.3.1. Les DATETIME, DATE, et types TIMESTAMP
Cependant, microsecondes ne peuvent pas être stockés dans une colonne de toute donnée temporelle type. Toute partie microsecondes est mis au rebut. Conversion de temps ou Les valeurs datetime sous forme numérique (pour exemple, en ajoutant +0) se traduit par un valeur double avec une partie microsecondes de 0,000000
Autres conseils
MySQL soutiendra microsecondes, consultez 5.6 MySQL .4 changelog:
fractionnaires secondes manutention
Incompatible Change: MySQL permet maintenant des fractions de seconde TIME, DATETIME, et les valeurs TIMESTAMP, avec un maximum de microsecondes (6 chiffres) précision. Pour définir une colonne qui comprend une fraction de seconde, utilisez la syntaxe nom_type (fsp), où nom_type est le temps, DATETIME, ou TIMESTAMP et FSP est la précision des fractions de seconde. Par exemple:
CREATE TABLE t1 (t TIME (3), dt DATETIME (6)); La valeur FSP, si elle est donnée, doit être comprise entre 0 à 6. Une valeur de 0 signifie qu'il n'y a partie fractionnaire. En cas d'omission, la précision par défaut est 0. (Cela diffère à partir de la valeur par défaut SQL standard de 6, pour la compatibilité avec les précédents MySQL versions.)
Les éléments suivants résument les implications de ce changement. Voir également la section 10.3.5, « Secondes fractionnaires valeurs de temps ».
Que diriez-vous séparer les parties de date dans une partie de date uniquement, et microsecondes de minuit? Il y a moins de 2 ^ 64 microsecondes dans la journée. Ensuite, regrouper le tableau {date, microseconde}.
Je suppose que, si je ne sais pas vos données, que certaines requêtes seraient très bien avec précision au niveau de jour - « expériences en 1964 » n'a pas besoin de se soucier de microsecondes.