2010-04-29 8 views
3

Je stocke l'horodatage en tant que champ int. Et sur une grande table, cela prend trop de temps pour obtenir des lignes insérées à la date car j'utilise la fonction mysql FROM_UNIXTIME.Horodatage en tant que champ int, requête de requête

SELECT * FROM table WHERE FROM_UNIXTIME(timestamp_field, '%Y-%m-%d') = '2010-04-04' 

Existe-t-il des moyens d'accélérer cette requête? Peut-être que je devrais utiliser la requête pour les lignes en utilisant timestamp_field >= x AND timestamp_field < y?

Merci


ÉDITÉE Cette requête fonctionne très bien, mais vous devez prendre soin de index sur timestamp_field.

SELECT * FROM table WHERE 
timestamp_field >= UNIX_TIMESTAMP('2010-04-14 00:00:00') 
AND timestamp_field <= UNIX_TIMESTAMP('2010-04-14 23:59:59') 
+0

Veuillez poster la table 'SHOW CREATE TABLE' pour votre table. Dans cette requête, changez le 'table' en minuscule quel que soit le vrai nom de votre table, mais pas le' TABLE' en majuscule car cela fait partie de la commande. –

Répondre

3

Utilisez UNIX_TIMESTAMP la constante au lieu de FROM_UNIXTIME sur la colonne:

SELECT * FROM table 
WHERE timestamp_field 
    BETWEEN UNIX_TIMESTAMP('2010-04-14 00:00:00') 
     AND UNIX_TIMESTAMP('2010-04-14 23:59:59') 

Cela peut être plus rapide car il permet à la base de données d'utiliser un index sur la colonne timestamp_field, si l'on existe. La base de données ne peut pas utiliser l'index lorsque vous utilisez une fonction non sargable comme FROM_UNIXTIME sur la colonne.

Si vous n'avez pas d'index sur timestamp_field, ajoutez-en un. Une fois cela fait, vous pouvez également essayer d'améliorer encore les performances en sélectionnant les colonnes dont vous avez besoin au lieu d'utiliser SELECT *.

+0

Vous avez votre idée! Mais votre requête renvoie 0 lignes, tandis que la requête de mes lignes de retour "EDITED". Je pense que vous avez mélangé timestamp_field = DATE ('2010-04-04') quand timestamp_field est TIMESTAMP, mais pas INT. – Kirzilla

+0

@Kirzilla: Oui, votre version éditée est correcte. Si ce n'est pas rapide, c'est très probablement parce que vous n'avez pas d'index sur timestamp_field. Créez un index sur timestamp_field pour accélérer la requête. Si vous croyez que vous avez déjà un index sur timestamp_field, veuillez poster la table SHOW CREATE TABLE pour votre table. –

+0

vous avez raison. Avec index cela fonctionne vraiment vite. Merci pour votre réponse. – Kirzilla

0

Si vous êtes en mesure de, il serait plus rapide soit stocker la date comme un champ datetime approprié ou, dans le code en cours d'exécution de la requête, pour convertir la date que vous êtes après un horodatage unix avant de l'envoyer à la requête.

Le FROM_UNIXTIME devrait convertir chaque enregistrement de la table avant de pouvoir le vérifier, ce qui, comme vous pouvez le voir, a des problèmes de performance. L'utilisation d'un type de données natif le plus proche de ce que vous utilisez réellement dans vos requêtes ou d'une requête avec le type de données de la colonne est le moyen le plus rapide. Donc, si vous devez continuer à utiliser un champ int pour votre temps, alors oui, l'utilisation de < et > sur un entier strict augmenterait grandement les performances, en supposant que vous stockez des éléments à la seconde, plutôt que l'horodatage qui serait pour la mi-journée de ce jour.

Questions connexes