|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre du Club
![]() Cédric PERRIERIngénieur systèmes et réseaux Inscription : juin 2010 Messages : 182 ![]() |
Bonjour,
je rencontre des pb de lenteur avec une requête. Comment faire pour l'accélérer au maximum ? Merci Citation:
Code :
Les Indexes sont mis en place dans la table : Citation:
|
||||
|
|
00
|
|
|
#2 | |||||||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Tout d'abord la requête est probabalement fausse, elle est à minima très peu fiable car :
devrait être : Code :
GROUP BY Reseaux.Service,Reseaux.Serveur,Reseaux.DNSServeur http://cedric-duprez.developpez.com/...fier-group-by/ Dans : Code :
Citation:
Sinon la partie : Code :
De même pourquoi utiliser la sous requête reseaux ? Le filtre effectué dans reseaux semble être effectuable directement. Compte tenu des remarques j'écrirais la requête comme suivant : Code :
La modification du GROUP BY étant une bonne piste d'analyse si les résultats ne sont plus les mêmes. Sinon concernant l'indexation, les infos fournies sont floues. Est-ce qu'il y a plusieurs index sur une colonne par table ou est-ce qu'il n'y a qu'un index multi-colonne par table ? Dans le cas présent il faut à minima un index sur les couples de colonnes suivants : t_Global_Clients (Service,Serveur) t_references (Service,NomServeur) t_Global_Serveurs (Service,Serveur) Pour t_Global_Serveurs, un index sur les 4 colonnes peut être intéressant : t_Global_Serveurs (Service,Serveur,adresseDebutPlage_traitee,adresseFinPlage_traitee) De même pour t_Global_Clients indéxer le triplet suivant peut être pas mal en utilisant l'alias C dans la requête corrélée (NOT EXISTS dans ma proposition) plutôt que T : t_Global_Clients (Service,Serveur, adresseIP_traitee) PS : l'ordre des colonnes Service,Serveur (ou NomServeur) dans la création des index est peut-être à inverser. Par ailleurs sur MySql la création d'index "lock" les tables, donc il faut les créer lors d'une faible utilisation de la base si les tables sont volumineuses, mais tu as sûrement une DEV pour tester. |
|||||||
|
|
00
|
|
|
#3 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 954 ![]() |
Les lenteurs de votre requête seront toujours là quelle que soit la façon dont vous vous prendrez et indexerez la base de données, car vous n'avez pas modélisé votre base correctement.
En effet vous n'avez pas respecté la première forme normale (1FN) qui dit que toutes les données des relations doivent être atomiques. Or votre adresse IP ne l'est pas ! D’où vos LIKE ...% qui seront toujours lents. En sus MySQL est connu pour être très mauvais en terme de performances sur les sous requêtes. Et là, à part de changer de SGBD pour un vrai SGBDR (MySQL n'étant que peu relationnel, à lire : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/), y'a pas de solution ! A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#4 | |
|
Membre du Club
![]() Cédric PERRIERIngénieur systèmes et réseaux Inscription : juin 2010 Messages : 182 ![]() |
Citation:
Que signifie la phrase sur les données qui doivent être atomiques ? Je ne suis pas DBA alors fabriquer une BDD avec le peu de connaissance que j'avais en plus en devant être rapide (on ne peut pas dire que ce soit simple, j'ai fait au plus vite, tout en sachant qu'elle est loin d'être nickel) Les LIKE ....% ne sont pas ce qui me ralentit le plus la requête, qu'ils soient ou non présents, certes ça change mais pas tant que ça. Sinon skuatamad je n'ai pas tout compris mais j'ai essayé la requête que tu indiques et malheureusement celle-ci ne me retourne pas les valeurs attendues. Pour les index par contre, je ne sais pas trop comment renseigner. J'ai un index par colonnes indiquées. C'est peut-être ça le pb de ma BDD, en fait je n'ai pas encore bien assimilé les histoires d'index, comment ça marche, comment bien les fabriquer, etc... donc j'ai fait au plus simple (ce qui n'est probablement pas la meilleure des solutions)
|
|
|
|
00
|
|
|
#5 |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Pour les index, regarde le tutoriel suivant : http://sqlpro.developpez.com/cours/quoi-indexer/
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
En quoi le résultat diffère ?
Si c'est le nombre de ligne alors c'est probablement lié au GROUP BY mais ça veut dire que ta requête initiale renvoyait des résultats aléatoires, donc elle n'était pas correcte. Pour vérifier il suffit de rajouter les colonnes dans le GROUP BY de ta requête. Si le résultat ne renvoit pas le bon nombre pour le COUNT, essaie avec ou avec une autre colonne sélectionnée, parce qu'effectivement tu utilisais DISTINCT dans ta sous requête alors que je l'avais supprimé. Si ça ne convient pas un jeu de test serait le bien venu pour aider à réécrire la requête. Concernant les index, il faut que tu crées des index sur plusieurs colonnes. PhpMyAdmin permet de le faire graphiquement sinon tu peux utiliser une commande comme : Code :
CREATE INDEX idx_Clients_1 ON t_Global_Clients (Service,Serveur) |
|
|
00
|
|
|
#7 | ||||
|
Membre du Club
![]() Cédric PERRIERIngénieur systèmes et réseaux Inscription : juin 2010 Messages : 182 ![]() |
Le fait de mettre
Code :
a permis de récupérer les résultats attendus En fait je comparais les 2 requêtes pour savoir si les résultats étaient bien identiques et maintenant c'est le cas. ![]() En plus, ta requête a fait un gain de tps énorme : je passe de 125s à 50s environ de tps d'exécution. Les 2 requêtes n'ont bien sûr pas été lancées en même tps mais l'une après l'autre afin de ne pas fausser les tps d'exécution. Le serveur étant chargé à fond lorsque les requêtes s'exécutent. Maintenant j'essaie d'adapter la requête afin de chercher la liste des réseaux des clients qui ne sont pas référencés dans les plages d'adresses indiquées par les serveurs. Par contre pour les index, j'ai encore bcp de mal à comprendre ce que je dois créer comme index. Suis qq peu perdu avec ça. Voici ce que j'ai comme index : Code :
Je pense que ça veut dire que j'ai un index par colonne mais le fait d'avoir un index par colonne (comme ici) pose-t-il de réels pb ? Que font les index sur les multiples colonnes comme tu indiques ? J'ai bcp de mal à comprendre |
||||
|
|
00
|
|
|
#8 | ||||
![]() ![]() |
Pour cette partie de la requête :
Code :
Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||||
|
00
|
|
|
#9 | |||||
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 125 ![]() |
Citation:
"10.192.3.1" n'est pas compris entre "10.192.0.0" et "10.192.255.255" La comparaison de chaines de caracteres n'a rien a voir a celle de numériques. MySql utilse les indexes pour les chaines de caracteres ne commencant pas par un caractere joker (source ici) Pouvez vous poster le plan d'execution de votre requete ? Cela sera beaucoup plus facile pour analyser les goulots d'etranglement. 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
|
|
|
#10 | |
![]() ![]() |
Citation:
J'ai répondu un peu vite sur ce coup là !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
|
00
|
|
|
#11 | |||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
De plus il peut même devenir inutile d'accéder à la table, l'index contenant déjà toutes les colonnes nécessaires. De plus, la base ne semble pas particulièrement modélisée, j'imagine que ce type de joiture est également réalisé dans d'autres requêtes. Code :
Le mieux est de pouvoir tester la création d'index multi colonne sur une base de test, car l'ordre des colonnes a un impact et que la création d'index vérouille la table. |
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com