Il est important de noter que l'ordre des champs de l'index est important.
Un index est, dans un sens, un arbre de recherche. Si vous indexez (B.event, B.state), l'arborescence regroupe tous les enregistrements avec le champ save "event", puis les ordonne par le champ "state".
Si vous deviez ensuite interroger cet index pour "b.state = x", l'index serait peu utile; L'index est trié par "l'événement" en premier.
Dans votre exemple:
- Filtre A par sa "événement"
- rejoindre A.event à B.event
- rejoindre B.state à C.id
- Inscrivez-vous B.hur = D.id
- ordre par B.event, B.timestamp
Il est important de noter que le optimize se penchera sur les statistiques de vos tables et index, peuvent ensuite réarranger l'ordre de les jointures. Le résultat sera le même, mais l'ordre peut donner des performances différentes, et le travail des optimiseurs consiste à essayer de trouver la meilleure performance.
Dans votre cas, je m'attendrais à ce que l'ordre de B.event soit extrêmement important. Simplement parce que c'est l'ordre de la sortie qui en résulte, ET c'est le champ que vous filtrez.
Ensuite, vous rejoignez B.state à C.id. Avoir et indexer sur C.id est donc bon, cela rend la jointure plus rapide. Mais également, avoir les données de la table B dans un bon ordre peut aussi rendre la jointure plus rapide. Mais, ayant un index sur B.event et un index séparé sur B.state peut donner peu. L'index B.state devient presque inutile car nous utilisons l'index B.event. Si vous combinez les deux dans un index (b.event puis b.state) le plan d'exécution peut trouver un moyen d'utiliser la partie b.state de l'index.
Enfin, si vous mettez tous les champs dans l'index, l'index s'agrandit, mais la requête n'aura peut-être jamais besoin de regarder la table. L'information est dans l'index. Le temps nécessaire pour aller d'un index à la table pour trouver les champs 'manquants' est similaire à celui d'une jointure. Donc, pour les performances de lecture, l'ajout de champs supplémentaires à l'index peut être significatif.
Je Wittering maintenant, mais le résumé est ceci:
- En général, index séparé sur les champs séparés ne sont pas utilisés ensemble
- Pour les index composites, l'ordre dans lequel vous spécifiez les champs fait une différence
- L'ajout de champs 'supplémentaires' à l'index le rend plus grand, mais peut également accélérer les requêtes
- L'ordre du plan d'exécution est plus important que l'ordre de votre requête
- Mais les index dont vous disposez peuvent déterminer l'ordre de le plan d'exécution
Ce type de travail a pas de réponses catégoriques. Il dépend tellement de vos données qu'il est plus proche d'un art.
Une option consiste à surcharger les tables avec des index, à examiner le plan d'exécution résultant et à supprimer les index inutiles.
Mais même là, une mise en garde s'applique. Comme le plan d'exécution dépend des données (et des statistiques de table), il est très important d'avoir des données réelles dans les tables. Alors que les tables ont 10 'ou 100s de lignes, un plan d'exécution peut être le plus rapide. Mais lorsque vous obtenez des millions de lignes, le plan d'exécution peut changer et bénéficier ainsi de différents index.
Correct, mais vérifiez si B.timestamp serait effectivement utilisé. – Pomyk
Quelle est la taille de chacune des tables et combien de lignes correspondrait-il à une requête donnée? Quelle base de données utilisez-vous? –
De même, à quelle fréquence les données sont-elles ajoutées aux tables et à quelle fréquence souhaitez-vous exécuter la requête? –