|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||
|
Membre à l'essai
![]() Inscription : octobre 2009 Messages : 63 ![]() |
Bonjour,
J'ai une table qui se nomme "utilisateur" avec deux colonnes : - Nom, - Prénom. J'aimerai avoir tous les utilisateurs dont les noms ou prénoms contiennent plusieurs chaines différentes. Par exemple ma table : Citation:
Résultat : Dupont José Dupont Albert Toto Tutu J'ai deux solutions différentes : Citation:
Citation:
Merci par avance. |
|||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 125 ![]() |
dans tous les cas, l'utilisation d'un
est contre performant Pour voir la difference entre vos 2 requetes, regardez le plan d'execution généré. Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac) |
|
|
00
|
|
|
#3 | ||
|
Membre à l'essai
![]() Inscription : octobre 2009 Messages : 63 ![]() |
Bonjour,
Merci pour cette réponse. Après une rapide recherche sur mon ami google, on utilise la commande EXPLAIN pour faire un plan d'exécution de la requête. Quand j'exécute la requête : Citation:
id -- select_type -- table -- type -- possible_keys -- key -- key_len -- ref -- rows -- Extra 1 -- PRIMARY -- <derived2> -- ALL -- NULL -- NULL - NULL -- NULL -- 36 -- Using where 2 -- DERIVED -- utilisateur -- ALL -- NULL -- NULL - NULL -- NULL -- 36 -- Et quand j'exécute la requête : Citation:
id -- select_type -- table -- type -- possible_keys -- key -- key_len -- ref -- rows -- Extra 1 -- SIMPLE -- utilisateur -- ALL -- NULL -- NULL - NULL -- NULL -- 36 -- Using where Par contre je ne sais pas comment interpréter ces résultats ? |
||
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
Bonjour,
MySql ? http://dev.mysql.com/doc/refman/5.0/...in-output.html La 1ere requête a une étape de plus car vous avez une sous-requête. Maintenant pour voir quelle solution est plus pertinente il faudrait que vous arriviez à sortir le coût réel de la requête. Ne connaissant pas plus que ça MySql je ne pourrai pas vous orienter la dessus. |
|
|
00
|
|
|
#5 |
|
Membre à l'essai
![]() Inscription : octobre 2009 Messages : 63 ![]() |
Désolé je ne l'avais pas précisé, je travaille bien avec mysql.
J'ai exécuté ces deux requêtes sur l'outil MySQL Query Browser. Merci pour la documentation, je l'ai déjà vu, il existe la même en français : http://dev.mysql.com/doc/refman/5.0/fr/explain.html Mon problème est que cela me donne peu d'indice qui me permettent de savoir laquelle est la plus performante/pertinente. En effet la première contient une sous requête donc est exécutée en deux fois donc potentiellement moins performante mais elle me permet d'exécuter qu'une seule fois la commande concat() qui peut être utilisée N fois dans la deuxième requête. Avec le résultat de EXPLAIN, je n'arrive toujours pas à me décidé car il y a peu de données. Je ne comprends pas non plus les résultats dans la colonne rows ("la colonne rows indique le nombre de ligne que MySQL estime devoir examiner pour exécuter la requête" ). Mon hypothèse serait que j'ai 2*36 instructions avec la sous-requête et 1*36 instructions avec la deuxième ? Donc la deuxième serait plus pertinente/performante même avec N fois concat() ? |
|
|
00
|
|
|
#6 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
Bah il existe une solution empirique aussi...
Chargez votre table avec la volumétrie cible (voir plus grosse) et comparez. Si vous faites ca, testez aussi une solution sans le concat pour voir comment le sgbd réagi. D'ailleurs je me demande pourquoi vous faites un concat car le cas suivant ressortira de votre recherche par exemple : |
|
|
00
|
|
|
#7 |
|
Membre à l'essai
![]() Inscription : octobre 2009 Messages : 63 ![]() |
La taille de la table utilisateur n'est pas forcément très importante.
Résultat de ma première requête : NomPrenom DupontJosé DupontAlbert TotoTutu Résultat de ma seconde requête : idUtilisateur -- Nom -- Prénom 1 -- Dupont -- José 2 -- Dupont -- Albert 3 -- Toto -- Tutu Sinon d'un point de vue syntaxique, ces deux requêtes sont bonnes ? Il n'y aurait pas une autre manière de faire ? |
|
|
00
|
|
|
#8 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
oui, elles sont bonnes.
L'autre manière de faire c'est virer le concat et faire plus de "or". Si votre volumétrie ne sera jamais importante vous n'aurez aucun problème avec ce genre de requête. Les problèmes viendront si votre table grossit vraiment, mais vu la demande il n'y aura pas de solution potable. A moins de faire de la consolidation dans une autre table si vos critères de recherche sont fixes .. |
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
Utilisée N fois (deux fois en fait), mais exécutée qu'une fois quand même puisque concat est une fonction déterministe, et que les paramètres qui lui sont fournis sont les mêmes dans les deux cas |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com