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 requette


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Par défaut Optimisation d'une requette
    Je logue les requêtes lentes de MySQL et j'en ai une qui revient souvent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT DISTINCT ski.products_id
                                 FROM search_keyword sk
                                 JOIN search_keyword_index ski
                                    ON (ski.search_keyword_id = sk.id_search_keyword AND sk.blacklisted = 0)
                                 JOIN products_stock ps
                                    ON (ski.products_id=ps.products_id
                                    AND ps.products_stock_quantity > 0)
                                 WHERE ( (sk.search_keyword LIKE '%alles') OR (sk.search_keyword LIKE 'sand%') );
    J'ai fait un explain qui me donne :
    id select_type table type possible_keys key key_len ref rows Extra
    1 SIMPLE ps ALL stock_quantity,products_id,products_stock_size_id NULL NULL NULL 26282 Using where; Using temporary
    1 SIMPLE ski ref search_keyword_id,products_id products_id 4 spartoo.ps.products_id 17 Using index
    1 SIMPLE sk eq_ref PRIMARY,id_search_keyword id_search_keyword 4 spartoo.ski.search_keyword_id 1 Using where; Distinct

    Mon problème est donc dans la première ligne.
    Il y a des index ou des clefs sur ces champs : stock_quantity,products_id,products_stock_size_id
    Cependant, MySQL n'utilise aucune clef pour faire le tri.

    J'ai bien un index sur products_id et sur products_stock_quantity. J'ai également essayé d'en créé un sur ces 2 clefs en même temps.
    Mais j'ai toujours une recherche de type ALL sur la première ligne.

    Pourquoi les index ne sont-ils pas utilisés? Je sais que je peux les forcer, mais j'aimerais déjà savoir pourquoi ça ne fonctionne pas.

    Existe-il un moyen de mieux tourner cette requête?

    Merci!

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 390
    Par défaut
    salut

    peut tu donner la structure de tes tables completes svp

  3. #3
    Membre éclairé
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Par défaut
    CREATE TABLE `products_stock` (
    `products_stock_id` int(11) NOT NULL auto_increment,
    `products_id` int(11) NOT NULL default '0',
    `products_stock_size_id` int(11) NOT NULL default '0',
    `products_stock_quantity` int(11) NOT NULL default '0',
    `products_stock_weight` double(10,4) NOT NULL,
    `gen_code` varchar(15) collate utf8_unicode_ci NOT NULL,
    `gen_code_logistic` varchar(255) collate utf8_unicode_ci default NULL,
    `minPerColis` int(2) default NULL COMMENT 'Definit le minimum de chaussures par colis',
    `seuil_secu` int(5) NOT NULL default '5' COMMENT 'seuil de s?curit?',
    `pareto` varchar(1) collate utf8_unicode_ci NOT NULL default 'C' COMMENT 'donne une valeur de pareto A,B,C pour la logistique',
    `preVente` float(4,3) NOT NULL COMMENT 'pr?vision des ventes sur 14 jours',
    `maxVente` int(11) NOT NULL COMMENT 'nom maxi vendu sur les 14 jours',
    `enCours` int(5) NOT NULL COMMENT 'Info pour la logistique, donn?es des encours sur ce produit',
    `refDone` tinyint(1) NOT NULL COMMENT 'flag poru dire si algo de reappro est d?ja pass?',
    `confirmLogistic` tinyint(4) NOT NULL COMMENT 'présence confirmé chez morin 0 - non 1 - oui',
    `suspLogistic` tinyint(4) NOT NULL default '0' COMMENT 'Suspension demandée chez Morin 0 - non 1 - oui',
    `quantityBrand` int(11) NOT NULL COMMENT 'quantite chez la marque',
    PRIMARY KEY (`products_stock_id`),
    KEY `products_id` (`products_id`),
    KEY `products_stock_size_id` (`products_stock_size_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=27063 ;

    -- --------------------------------------------------------

    --
    -- Structure de la table `search_keyword`
    --

    CREATE TABLE `search_keyword` (
    `search_keyword` varchar(255) collate utf8_unicode_ci NOT NULL,
    `id_search_keyword` int(11) NOT NULL auto_increment,
    `blacklisted` int(11) NOT NULL default '0',
    PRIMARY KEY (`search_keyword`),
    UNIQUE KEY `id_search_keyword` (`id_search_keyword`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8380 ;

    -- --------------------------------------------------------

    --
    -- Structure de la table `search_keyword_index`
    --

    CREATE TABLE `search_keyword_index` (
    `search_keyword_id` int(11) NOT NULL,
    `products_id` int(11) NOT NULL,
    UNIQUE KEY `search_keyword_id` (`search_keyword_id`,`products_id`),
    KEY `products_id` (`products_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

  4. #4
    Membre chevronné Avatar de jota5450
    Inscrit en
    Janvier 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Janvier 2006
    Messages : 263
    Par défaut
    slt....


    Il y a des index ou des clefs sur ces champs : stock_quantity,products_id,products_stock_size_id
    Cependant, MySQL n'utilise aucune clef pour faire le tri.

    J'ai bien un index sur products_id et sur products_stock_quantity
    les noms se resemble telement, que meme tois tu les melanges....

    sur ta table products_stock

    ta:
    PRIMARY KEY (`products_stock_id`),
    KEY `products_id` (`products_id`),
    KEY `products_stock_size_id` (`products_stock_size_id`)
    il est ou le products_stock_quantity ? ....


    Comme tu as un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND ps.products_stock_quantity > 0
    Ca devras faire enorme diference....

  5. #5
    Membre éclairé
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Par défaut
    Ok, j'ai fait ça.
    J'ai hésité à ajouter un index sur products_stock_quantity du fait de sa faible sélectivité.
    Seulement 248 alors que la table fait 30000 lignes. Enfin, c'est déjà peut être beaucoup...

    Maintenant, question :
    Est-ce que ça vaudrait le coup que j'ajoute un index sur products_stock_quantity ET products_id ?

    Dois-je enlever les deux premiers index dans ce cas?

    Est-ce mieux comme ça?

    Merci beaucoup pour la réponse en tous cas!

  6. #6
    Membre éclairé
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Par défaut
    J'ai refait un EXPLAIN sur la requête du haut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
     
    1	SIMPLE	ski	index	search_keyword_id	search_keyword_id	8	NULL	64808	Using index; Using temporary
    1	SIMPLE	ps	ref	products_stock_quantity,products_id	products_id	4	spartoo.ski.products_id	3	Using where; Distinct
    1	SIMPLE	sk	eq_ref	PRIMARY,id_search_keyword	id_search_keyword	4	spartoo.ski.search_keyword_id	1	Using where; Distinct

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

Discussions similaires

  1. Optimisation d'une recherche et mise à jour
    Par gandf dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/01/2005, 18h38
  2. Réponses: 17
    Dernier message: 03/12/2004, 11h17
  3. Supression d'une requette
    Par AlphonseBrown dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/11/2004, 16h03
  4. [Debutant] Optimisation d'une boucle
    Par Javatator dans le forum Langage
    Réponses: 3
    Dernier message: 25/10/2004, 18h50
  5. Trie sur une requette SELECT
    Par Yali dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/08/2004, 09h56

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