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 :

Utilisation des tables d'index sur select * order by c2,C1


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Utilisation des tables d'index sur select * order by c2,C1
    je crée avec MySQL une table simple avec trois champs dont deux champs c1 et C2 sont dans la PRIMARY.

    Si je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * 
    from table 
    order by c1,C2
    il utilise la table d'index de la primary.

    Si je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * 
    from table 
    order by c2,c1
    il n'utilise aucune table d'index ALORS que j'ai ajoute une table d'index unique C2,C1 en plus.

    Remarque, si je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select c2,c1 
    from table 
    order by c2,c1
    il utilise la table d'index ajoutée.


    Comment faire pour qu'il utilise la table d'index dans le cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * 
    from table 
    order by c2,c1
    " ??


    Voici l'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    create database MYBASE;
     
    DROP TABLE IF EXISTS `MYBASE`.`MYTABLE` ;
     
    CREATE  TABLE IF NOT EXISTS `MYBASE`.`MYTABLE` (
      `NUMBER` INT(11) NOT NULL ,
      `NAME` VARCHAR(10) NOT NULL ,
      `STATE` INT(11) NOT NULL ,
      PRIMARY KEY (`NUMBER`, `NAME`) )
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = latin1;
     
    CREATE INDEX `idx_number` ON `MYBASE`.`MYTABLE` (`NUMBER` ASC) ;
    CREATE INDEX `idx_name` ON `MYBASE`.`MYTABLE` (`NAME` ASC) ;
    CREATE UNIQUE INDEX `idx_name_number` ON `MYBASE`.`MYTABLE` (`NAME` ASC, `NUMBER` ASC) ;
    Pour la tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    use mybase;
    explain 
    select * 
    from mytable 
    order by number,name 
    limit 100000,2;
    -> utilise la PRIMARY

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    explain 
    select * 
    from mytable 
    order by name,number 
    limit 100000,2;
    -> Using filesort

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    explain 
    select name,number  
    from mytable 
    order by name,number 
    limit 100000,2;
    -> Utilise idx_name

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Cas intéressant de guerre des étoiles peut-être ? Et qui montrerait une fois de plus qu'il vaut mieux nommer les colonnes du SELECT. As-tu essayé ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    explain 
    select name,number, state  
    from mytable 
    order by name,number 
    limit 100000,2;
    Remarque :
    Ton index sur NUMBER est inutile puisque cette colonne est déjà indexée par la clé primaire.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/06/2007, 13h48
  2. [RCP] utilisation des tables spring RCP
    Par sprite28121982 dans le forum Spring
    Réponses: 3
    Dernier message: 26/12/2006, 21h02
  3. Pourquoi faut-il utiliser des tables plutôt que des frames ?
    Par malicia_bm dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 09/10/2006, 09h20
  4. Rôle et utilisation des tables système RDB$
    Par lio33 dans le forum Débuter
    Réponses: 2
    Dernier message: 06/10/2005, 11h41
  5. SQL 2000 - Liste + taille des tables et index
    Par Fox dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/03/2004, 15h59

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