Index MySQL - combien sont-ils assez?
Je suis en train de peaufiner mon serveur MySQL donc je vérifier mes paramètres, l'analyse de lent-journal de la requête, et de simplifier mes questions si possible.
Parfois, il est assez si je suis indexation correctement, parfois pas. J'ai lu quelque part (merci de me corriger si c'est de la bêtise) que de plus en plus d'indices que j'ai besoin de faire le même effet, comme si je n'ai pas d'index.
Comment de nombreux indices sont assez? Vous pouvez dire qu'il dépend d'une centaine de facteurs, mais je suis curieux de savoir comment puis-je nettoyer mon mysql-slow.log
assez pour réduire la charge du serveur.
En outre, j'ai vu quelques "intéressant" entrées de journal comme ceci:
# Query_time: 0 Lock_time: 0 Rows_sent: 22 Rows_examined: 44
SELECT * FROM `categories` ORDER BY `orderid` ASC;
La table en question contient exactement 22 lignes, index mis en orderid
. Pourquoi est-ce une requête en montrant dans le journal, après tout? Pourquoi examiner 44 lignes si elle ne contient que 22?
- Je suppose qu'il ne sorte, donc c'est en quelque sorte examine la même ligne plusieurs fois 😡
- Ce qui est retourné pour EXPLIQUER SÉLECTIONNEZ * à PARTIR de
categories
COMMANDE PARorderid
de l'ASC; - Bemrose: Si je corriger les retours Supplémentaires: à l'Aide de filesort. C'est peut-être le problème?
Vous devez vous connecter pour publier un commentaire.
Le montant de l'indexation et de la ligne d'en faire trop dépendra de beaucoup de facteurs. Sur les petites tables comme vos "catégories" table d'habitude vous ne voulez pas ou besoin d'un indice et il peut effectivement nuire à la performance. La raison en est qu'il faut d'e/S (c'est à dire le temps) de lire un index et puis de plus en plus d'e/S et le temps de récupérer les enregistrements associés avec les lignes correspondantes. Une exception quand vous avez seulement interroger les colonnes contenues dans l'index.
Dans votre exemple, vous récupérez toutes les colonnes et avec seulement 22 lignes et il peut être plus rapide de faire un tableau d'analyse et de tri à la place de l'aide de l'index. L'optimiseur peut/doit faire ceci, et en ignorant l'index. Si c'est le cas, alors l'indice est juste en prenant de l'espace avec aucun avantage. Si votre "catégories" de la table est accessible souvent, vous pourriez envisager de les épingler dans la mémoire de sorte que le serveur de base de données conserve accessible sans avoir à goto le disque de tous les temps.
Lors de l'ajout d'index, vous devez équilibrer l'espace disque, les performances de la requête, et la performance de la mise à jour et de l'insérer dans les tables. Vous pouvez vous en sortir avec plus d'indices sur les tables qui sont statiques et ne change pas beaucoup par opposition à des tables avec des millions de mises à jour. Vous allez commencer à ressentir les effets de l'indice de maintenance à ce point. Ce qui est acceptable dans votre environnement si est et ne peut être déterminé par vous et votre organisation.
Lorsque vous faites votre analyse, assurez-vous de générer ou mettre à jour votre table et l'index de la statistique, de sorte que vous pouvez être assuré de l'exactitude des calculs.
pin
une table en mémoire?En règle générale, vous devriez avoir des indices sur toutes les clés primaires (vous n'avez pas le choix dans cette), toutes les clés étrangères, et tous les autres champs que vous utilisez habituellement pour extraire les lignes.
Par exemple, si j'ai souvent rechercher des utilisateurs par nom d'utilisateur, je n'aurais que l'indexation, même si l'utilisateur ID est la clé primaire.
Comment beaucoup d'index repose entièrement sur les requêtes de votre course, quels sont les types de jointures sont en train de faire (le cas échéant), le type de données stockées dans le tableau et comment les grandes tables sont (ainsi que de nombreux autres facteurs). Il n'y a vraiment pas de science exacte pour elle. Le plus grand outil dans votre arsenal pour comprendre comment optimiser une requête est expliquer. L'aide d'expliquer comment vous pouvez savoir quel genre de jointures sont, ce qu'clés possibles pourraient être utilisés et dont les principaux (le cas échéant) a été utilisé ainsi que le nombre de lignes qui ont été examinés pour chaque table dans la jointure.
À l'aide de cette information, vous pouvez décider comment les clés de vos tables et/ou modifier vos requêtes pour les rendre plus efficaces. La syntaxe pour l'expliquer, c'est très simple.
Note, expliquer ne pas fait exécuter la requête. Ainsi, si vous utilisez ce pour déboguer une requête qui prend 5 minutes pour s'exécuter, expliquer va encore être très rapide.
Vous ne devez être prudent lors de l'ajout d'index si, comme ils ne causent insertions et mises à jour pour y aller plus lentement et sur de très grandes tables de ce gain de performance peut devenir perceptible. Surtout si cette table est utilisée pour beaucoup de lectures. Tout en ajoutant beaucoup d'indices généralement ne tuent pas les performances d'une requête, vous devez seulement ajouter que yo
Également garder à l'esprit que MySQL va utiliser un maximum de un index par sélectionner déclaration (bien que si vous utilisez une jointure, il peut aussi en utiliser une pour chaque jointure). Afin d'indexation juste parce que est un gaspillage d'espace disque et ralentissent la base de données vers le bas sur l'écrit. Si vous avez l'habitude d'utiliser un où la déclaration sur deux colonnes, procédez de l'une d'index contenant à la fois de ces colonnes, il sera nettement plus rapide que l'indexation juste un seul.
Un index peut accélérer une requête SELECT, mais, il va ralentir INSÉRER/mettre à JOUR/SUPPRIMER des requêtes parce qu'ils ont besoin de mettre à jour les index ainsi, non seulement la ligne.
C'est juste un avis personnel (je n'ai pas de faits à l'appui), mais je pense que si il y a une requête qui prend beaucoup de temps et un indice de vitesse, il - y pour elle! "Trop nombreux" indices serait si vous avez ajouté des indices qui n'ont en rien (par exemple, il n'y avait pas de question elle permettrait d'accélérer). Par exemple, une chose stupide à faire serait de placer un index sur chaque colonne, "juste parce que".
Il n'y a pas de nombre magique pour le "meilleur" nombre d'index. La règle de base est: ajouter des index pour les requêtes qui sont souvent utilisés et/ou le besoin de courir vite.
Avoir "trop" indices ne devrait pas ralentir les requêtes, mais à chaque index a ajouté ajoute une petite quantité de temps à ajouter/mettre à jour des éléments dans la base de données (car il modifie les indices ainsi), et une petite quantité d'espace. Toutefois, si vous êtes juste en ajoutant des index, cela n'est probablement pas une grande préoccupation.