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 :

Question sur la rapidité d'une requete


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 99
    Points : 64
    Points
    64
    Par défaut Question sur la rapidité d'une requete
    Bonjour tout le monde.
    Une question que je me pose depuis longtemps.
    Considérons une table avec un id comme clé primaire en auto incrémente et 3 champs : champ1 et champ2 (VARCHAR on va dire) et date (type date).

    1) Si je souhaite faire un select, qu'est-ce qui est le plus rapide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * from table where id = '65'
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * from table where id = '65' AND champ1 = 'sdfsdf' AND champ2 = 'fghfghfg'
    en supposant que les champs contiennent "sdfsdf" et "fghfghfg"

    2) Autre chose
    Maintenant je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * from table where id = '65' 
    AND 'tres gros calcul de conversion sur le champ date'
    Comment mysql va optimiser cela, va-t-il d'abord regarder s'il trouve l'id 65 puis faire le gros calcul ou bien faire plusieurs fois le gros calcul jusqu'a ce qu'il tombe sur l'id 65.

    3) Dans le précédent cas, id était unique (car auto-incrémenté). Si ce n'était pas le cas genre on le retrouve une dizaine de fois dans une table de 100000 entrées mais que le champ est indexé, le calcul de date ne se ferait que sur les 10 lignes ramenées ou sur d'autre lignes pendant la recherche.

    J'espère que vous avez compris ce que je souhaitais dire (mais non je ne vous prends pas pour des cons ). Je vous remercie.

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    normalement MySQL évalue d'abord les propriétés les moins couteuses...

    ensuite, il vaut mieux s'en assuré via l'ordre d'indication (d'abord les moins couteux)...

    pour être sûr de tout ça, il faudrait tout de même consulter la doc sur l'optimisation : http://dev.mysql.com/doc/refman/4.1/...imization.html

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 99
    Points : 64
    Points
    64
    Par défaut
    C'est ce que je me dit donc je mets les condition sur la clé primaire en 1er, puis les index puis les calculs les plus gros à la fin.
    Si quelqu'un pouvait me confirmer cela.

  4. #4
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    http://dev.mysql.com/doc/refman/4.1/...mizations.html

    Je pense que l'on peut compter à ce que les champs indexés (surtout s'ils ont des valeurs uniques, comme une clef primaire) soient traités en premier.
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * from table where id = '65' AND champ1 = 'sdfsdf' AND champ2 = 'fghfghfg'
    sera plus lent que la version sans les égalités, mais si id est une clef cela ne fera jamais que deux comparaisons effectuées sur la ligne retournée (bref rien).

    Après pour la complexité des différents tests d'un where... Je suppose que pour les simples égalités les choses sont claires mais après...

    3) Dans le précédent cas, id était unique (car auto-incrémenté). Si ce n'était pas le cas genre on le retrouve une dizaine de fois dans une table de 100000 entrées mais que le champ est indexé, le calcul de date ne se ferait que sur les 10 lignes ramenées ou sur d'autre lignes pendant la recherche.
    D'après la doc sans problème. C'est les index d'abord, et ceux qui éliminent le plus en premier. Pour passer à côté il faut une table très petite ou un index qui ne sert à rien (donc pas du 10 pour 100000) :
    http://dev.mysql.com/doc/refman/4.1/...able-scan.html
    (y'a même FORCE INDEX pour les paranoïaques que nous sommes)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Changer le nom d'une table sur SQL server avec une requete
    Par Oluha dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 01/02/2014, 23h35
  2. Question sur la rapidité d'une macro
    Par johannj dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/06/2009, 16h29
  3. question sur la formulation d'une requete
    Par moha_alnif dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/05/2009, 14h32
  4. Réponses: 5
    Dernier message: 13/10/2005, 12h46
  5. substr sur le $resultat d'une requete
    Par grellierj dans le forum Langage SQL
    Réponses: 12
    Dernier message: 21/01/2005, 11h28

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