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 :

Optimisation d'une requete SELECT WHERE IN


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 35
    Par défaut Optimisation d'une requete SELECT WHERE IN
    Bonjour messieurs,

    Je cherche a optimiser une requête , je constate que l'analyse du résultat via EXPLAIN semble surprenant, je m'explique, j'ai une table très simple :
    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
    16
    17
    18
    19
    20
    CREATE TABLE `toto` (
      `id` tinyint(3) unsigned NOT NULL default '0',
      `mot` varchar(30) NOT NULL default '',
      UNIQUE KEY `id` (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
     
    -- 
    -- Contenu de la table `toto`
    -- 
     
    INSERT INTO `toto` VALUES (1, 'toto');
    INSERT INTO `toto` VALUES (2, 'tata');
    INSERT INTO `toto` VALUES (3, 'titi');
    INSERT INTO `toto` VALUES (4, 'tutu');
    INSERT INTO `toto` VALUES (5, 'momo');
    INSERT INTO `toto` VALUES (6, 'mama');
    INSERT INTO `toto` VALUES (7, 'mimi');
    INSERT INTO `toto` VALUES (8, 'meme');
    INSERT INTO `toto` VALUES (9, 'mumu');
    INSERT INTO `toto` VALUES (10, 'mbmb');
    Si je fait la requête suivante :

    EXPLAIN SELECT id, mot FROM toto WHERE id IN ( 1, 2 )

    J'ai le résultat suivant :
    id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
    1 | SIMPLE | toto | range | id | id | 1 | NULL | 2 | Using where

    On vois que le nombre de lignes parcourus est bien de 2 : normal, j'ai bien un index, et je fait une recherche avec deux valeur dans mon where

    Maintenant et c'est là que tout deviens surprenant avec une seconde requète

    EXPLAIN SELECT id, mot FROM toto WHERE id IN ( 1, 2, 3 )

    J'ai le résultat suivant :
    id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
    1 | SIMPLE | toto | ALL | id | NULL | NULL | NULL | 10 | Using where

    Et la on constate que tous les éléments de ma table sont parcouru, que le type de recherche passe de "range" à "ALL" alors la grande question est pourquoi ?

    Nota, je fait des test en local sous windows avec phpmyadmin, j'ai remarqué que si je fait les tests en ligne (serveur linux) je constate le problème au delà de 8 condition dans mon WHERE IN ...... de plus, j'ai essayé de mettre l'index en clé primaire, clé index ou clé unique, j'ai le même problème dans les 3 cas.

  2. #2
    Membre Expert Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Par défaut
    Salut,

    J'imagine que l'optimiseur estime que le nombre de lignes à récupérer est suffisamment grand pour aller les lire en séquence directement dans les blocs de données plutôt que passer par l'index...

    Sometimes MySQL does not use an index, even if one is available. One circumstance under which this occurs is when the optimizer estimates that using the index would require MySQL to access a very large percentage of the rows in the table. (In this case, a table scan is likely to be much faster because it requires fewer seeks.) However, if such a query uses LIMIT to retrieve only some of the rows, MySQL uses an index anyway, because it can much more quickly find the few rows to return in the result.
    http://dev.mysql.com/doc/refman/5.0/...l-indexes.html

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 35
    Par défaut
    Ok, j'ai posé un LIMIT 0,3 à la fin et effectivement, j'ai le résultat escompté, je vais procéder de cette façon alors.

    Merci de ton aide

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

Discussions similaires

  1. transformation sur une requete SELECT
    Par juniorAl dans le forum Langage SQL
    Réponses: 8
    Dernier message: 08/04/2005, 18h12
  2. optimisation d'une requete de recherche
    Par moog dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 06/04/2005, 16h58
  3. Afficher le numéro de ligne dans une requete SELECT
    Par tilb dans le forum Langage SQL
    Réponses: 4
    Dernier message: 01/09/2004, 10h20
  4. [BDE & excel] la syntaxe d'une requete select
    Par mandale dans le forum Bases de données
    Réponses: 2
    Dernier message: 25/08/2004, 15h38
  5. Eviter plusieurs OR dans une requete SELECT
    Par zoubidaman dans le forum Requêtes
    Réponses: 2
    Dernier message: 13/06/2004, 05h56

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