IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Index partiel sur champ datetime


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 275
    Par défaut Index partiel sur champ datetime
    BOnjour,

    Est-il possible de faire un index partiel sur une champ date time

    en effet je souhaite que l'index ne retienne que aaa-mm-jj (sans les heurs, minutes ...)

    Est ce possible ? si oui comment svp ?

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 703
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    C'est possible avec le mot clef KEY_PART utilisé dans l'instruction CREATE INDEX mais uniquement sur les colonnes de type (var)char.
    Et ça n'est pas forcément utile, ça dépend du but recherché

    Voici un extrait de la documentation MySQL V8.0 (KEY_PART est applicable aussi avec la V5.7)

    Pièce jointe 536030

    cf. https://dev.mysql.com/doc/refman/8.0...ate-index.html

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 275
    Par défaut
    merci

    mais c'est sur le champ datetime que j'espérais faire une clef partielle, tant pis

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 703
    Billets dans le blog
    10
    Par défaut
    OK mais pourquoi vouloir faire cet index partiel, quel est le but recherché ?

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 275
    Par défaut
    j'utilise un champ datetime, j'ai pas mal de requetes qui se base sur ce champ, mais que sur la partie date (aaa-mm-dd)

    je souhaite donc indexé ce champ uniquement sur la partie aaaa-mm-dd pour accélerer mes requetes SELECT

    mon champ est actuellement indexé mais ça ne sert à rien "tant donné que chaque valeur de datetime est unique (à cause de millisecondes)

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 703
    Billets dans le blog
    10
    Par défaut
    Il suffit d'utiliser l'opérateur BETWEEN et votre index sera éligible et efficace, sous réserve qu'il soit filtrant bien sûr
    Pas besoin d'index sur une partie de la colonne donc

  7. #7
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 219
    Par défaut
    Salut à tous.

    Citation Envoyé par saluts92
    Est-il possible de faire un index partiel sur une champ date time
    Non car la colonne date+time est de type numérique. Plus précisemment, un nombre en seconde qui débute le 1er janvier 1970 à 00 h 00 min 00 s.

    Citation Envoyé par saluts92
    en effet je souhaite que l'index ne retienne que aaa-mm-jj (sans les heurs, minutes ...)
    Décomposez votre colonne date+time en deux colonnes séparées, l'une étant "date" et l'autre étant "time".

    Citation Envoyé par saluts92
    mon champ est actuellement indexé mais ça ne sert à rien "tant donné que chaque valeur de datetime est unique (à cause de millisecondes)
    On ne dit pas champ mais colonne. Ce n'est pas une colonne de type "datetime" mais plutôt de type "timestamp".

    Citation Envoyé par saluts92
    BETWEEN est donc plus efficace que ci-dessus ?
    Pas vraiement. Les deux écritures produisent le même résultat.

    Ce que vous avez fait est correcte.
    Je n'ai toujours pas compris votre problème.
    Avez-vous un problème de performance ?

    @+

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 275
    Par défaut
    "On ne dit pas champ mais colonne" on dit aussi champ

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 275
    Par défaut
    "Avez-vous un problème de performance ?"

    Oui, sur notre back-office nous avons un formulaire de statistiques, et je souhaite optimiser les requetes SQL (une 15aine) qui se base surtout sur les dates (aaammjj ou aaaamm ou jj)

    je sais que l'on pourrait séparé les statistiques, mais bon, ce n'est pas ce que le "patron" veut

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 703
    Billets dans le blog
    10
    Par défaut
    Bonsoir saluts92
    Citation Envoyé par saluts92 Voir le message
    "On ne dit pas champ mais colonne" on dit aussi champ
    En fait non : Artemus24 a raison. Bien que le terme "champ" soit souvent rencontré, il est impropre concernant les SGBDR. Ce terme peut être utilisé pour une zone de saisie d'un formulaire ou pour une zone d'édition d'un état ou d'affichage sur un écran. Dans une base de données, il y a des colonnes (au niveau physique ou logique, c'est à dire dans les tables) ou des attributs (au niveau conceptuel).

    Citation Envoyé par saluts92 Voir le message
    "Avez-vous un problème de performance ?"
    Oui, sur notre back-office nous avons un formulaire de statistiques, et je souhaite optimiser les requetes SQL (une 15aine) qui se base surtout sur les dates (aaammjj ou aaaamm ou jj)
    je sais que l'on pourrait séparé les statistiques, mais bon, ce n'est pas ce que le "patron" veut
    Si vous avez besoin d'aide pour optimiser vos requêtes, il faut publier les requêtes concernées ainsi que la description exacte des tables et de leurs index.
    Vous pouvez aussi utiliser "explain" qui analysera pour vous la stratégie d'accès choisie par l'optimiseur, c'est toujours d'un grand secours

    Attention, dans les SGBD, une date c'est une date, c'est à dire stockée dans sa totalité : siècle + année + mois + jour.
    Optionnellement vous pouvez choisir un type dateheure ou timestamp qui permet de stocker non seulement la date, mais aussi l'heure, voire les micro ou nanosecondes selon le SGBD.

    Mais dans aucun SGBD, la date ne peut se résumer au jour, ou à l'année+le mois

    Il ne faut pas confondre le type d'une colonne (date, caractère, caractère variable, décimal etc...) et son format de restitution.
    C'est important car les fonctions liées aux types date ne sont applicables qu'aux colonnes de ce type, tout autre type requiert des transformations hasardeuses quant au contenu et qui dégradent très fortement les performances, surtout si on les applique sur les prédicats de filtrage et/ou de jointure

    C'est pourquoi j'insiste : publiez les requêtes concernées et le DDL create table et create index

Discussions similaires

  1. [11g] Index spatial sur champs de type SDO_GEOMETRY
    Par Lancelot du Lac35 dans le forum Oracle
    Réponses: 1
    Dernier message: 24/02/2015, 13h55
  2. Index unique sur champ nullable
    Par olibara dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/05/2013, 11h36
  3. Requete SQL sur champ datetime si heure
    Par blacklolou dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 26/06/2012, 18h04
  4. Index sur champs datetime
    Par fred_04510 dans le forum Développement
    Réponses: 12
    Dernier message: 07/04/2009, 15h08
  5. Requete sur champ datetime
    Par BigZ444 dans le forum Requêtes
    Réponses: 1
    Dernier message: 28/06/2007, 10h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo