|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||||
|
Invité régulier
![]() Inscription : février 2007 Messages : 17 ![]() |
Bonjour à tous,
Une petite description de mes tables/vues avant d'exposer mon problème : Une table principale, avec exactement 17 colonnes : Code :
Il y a également 2 vues permettant des accès différents aux données. La première permettant un accès total alors que la seconde limite l'accès à certaines données : Code :
Il y a +/- 800.000 enregistrements pour vue_annuel_ann_total et 120.000 pour vue_annuel_ann_part. Jusque là, pas de souci : Code :
Code :
Je me suis dit que cela devait venir du fait que la vue est créée à partir de plusieurs tables/vues et j'ai recréé une vue comme ceci : Code :
Je ne comprends absolument pas d'où cela peut venir... Si vous avez une idée ou une piste de solution, cela m'aiderait grandement ! Merci d'avance. |
||||||||||
|
|
00
|
|
|
#2 |
![]() ![]() |
Il faudrait faire un EXPLAIN de la requête qui pose problème pour essayer de comprendre ce qu'il se passe mais il est possible que l'index sur ann_niveau ne soit pas utilisé car il ne contient pas assez de valeurs différentes, étant un CHAR(1).
Sinon, un petit OPTIMIZE pourrait peut-être permettre de réorganiser un peu les données et accélérer la requête ?
__________________
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
|
|
|
#3 | ||||||||
|
Invité régulier
![]() Inscription : février 2007 Messages : 17 ![]() |
Merci de ta réponse. En effet, j'étais justement en train de faire quelques EXPLAIN pour tenter de comprendre. Voici les résultats :
(1) Pour vue_annuel_ann_total : Code :
Code :
Code :
Code :
Le (3) semble logique également : une sous-requête et utilisation de l'index. C'est le (2) qui me pose problème comme je le disais. On dirait que la vue est analysée dans un ordre différent selon la requête... |
||||||||
|
|
00
|
|
|
#4 |
|
Invité régulier
![]() Inscription : février 2007 Messages : 17 ![]() |
Et bien... après avoir épluché la doc et fait de nombreux tests, je viens de comprendre d'où venait mon problème.
En fait MySQL ne prend en considération qu'un seul index à la fois... Je n'ai eu qu'à créer un index prenant l'ensemble des colonnes nécessaires. Etant en train de migrer une base de données de PostgreSQL vers MySQL (par obligation), je ne suis pas habitué à ceci. PostgreSQL permet justement de combiner plusieurs index. Suite à cela, plusieurs questions me viennent donc. Tout d'abord, ai-je raison par rapport à mon affirmation précédente ? Ensuite, à chaque fois que je crée une fonction, il va falloir que je vérifie les colonnes permettant un index. Une table dite "principale" sur laquelle des centaines de requêtes différentes peuvent être exécutées peut donc contenir un nombre d'index extrêmement important ? De plus, il est impossible de déterminer l'ensemble des requêtes que les utilisateurs pourraient effectuer... Comment puis-je estimer cela ? En créant un grand nombre d'index directement ? |
|
|
00
|
|
|
#5 | |
![]() ![]() |
Citation:
Je savais que MySQL n'est pas un SGBD terrible mais là on touche le fond !
__________________
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
|
|
|
#6 | ||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
L'index est une méthode d'accès à la table (en opposition au FULL SCAN) le SGBD choisit donc UN index pour accéder aux données... si un index disponnible sur une colonne n'est pas très pertinent alors qu'un index sur plusieurs colonnes l'est alors oui il faut créer un index sur plusieurs colonnes. En quoi postrge proposait un meilleur plan ? (on parle bien de combiner plusieurs index d'une même table pour accéder uniquement aux données de cette table ?) A ma connaissance seul les index bitmap sont combinables (en tout cas c'est vrai sur oracle) mais ce genre d'index n'est pas utilisable en environnment OLTP. Citation:
Après c'est aussi un compromis avec les contraintes de l'appli en écriture (Insert, update, delete) mais plusieurs index est normal. Il faut avant tout optimiser les requêtes les plus fréquemment utilisées. |
||
|
|
00
|
|
|
#7 | |||
|
Invité régulier
![]() Inscription : février 2007 Messages : 17 ![]() |
Citation:
Citation:
Du coup, ca ne marchait pas. Enfin bon... Et bien, dans mon cas, la table que je présentais dans mon premier post est constitué de 17 colonnes. Sachant que les différentes requêtes présentent les informations sous forme d'indicateurs, n'importe quelle colonne peut être combinée avec n'importe quelle autre (et même plusieurs combinées ensemble), je me retrouve avec un nombre d'index possibles énorme... Citation:
Enfin bon, j'ai au moins pu répondre à l'ensemble de mes questions. Merci à vous. |
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com