Récemment, j'ai appris la merveille des index et les performances se sont considérablement améliorées. Cependant, avec tout ce que j'ai appris, je n'arrive pas à trouver la réponse à cette question.
Les index sont excellents, mais pourquoi quelqu'un ne pourrait-il pas simplement indexer tous les champs pour rendre la table incroyablement rapide? Je suis sûr qu'il y a une bonne raison de ne pas faire cela, mais qu'en est-il de trois champs dans une table à trente champs? 10 dans un champ de 30? Où doit-on tracer la ligne et pourquoi?
Réponses:
Les index occupent de l'espace en mémoire (RAM); Trop ou trop grand d'index et la base de données va devoir les échanger vers et depuis le disque. Ils augmentent également le temps d'insertion et de suppression (chaque index doit être mis à jour pour chaque élément de données inséré / supprimé / mis à jour).
Vous n'avez pas de mémoire infinie. Faire en sorte que tous les index tiennent dans la RAM = bon.
Vous n'avez pas de temps infini. L'indexation uniquement des colonnes dont vous avez besoin pour l'indexation minimise l'atteinte des performances d'insertion / suppression / mise à jour.
la source
Gardez à l'esprit que chaque index doit être mis à jour chaque fois qu'une ligne est mise à jour, insérée ou supprimée. Ainsi, plus vous avez d'index, plus les performances seront lentes pour les opérations d'écriture.
En outre, chaque index occupe davantage d'espace disque et d'espace mémoire (lorsqu'il est appelé), ce qui peut également ralentir les opérations de lecture (pour les grandes tables). Regarde ça
la source
Vous devez équilibrer les besoins de CRUD. L'écriture dans les tableaux devient lente. Quant à savoir où tracer la ligne, cela dépend de la façon dont les données sont accédées (tri, filtrage, etc.).
la source
L'indexation occupera plus d'espace alloué à la fois du lecteur et de la RAM, mais améliorera également considérablement les performances. Malheureusement, lorsqu'il atteint la limite de mémoire, le système restitue l'espace disque et risque les performances. En pratique, vous ne devriez indexer aucun champ qui, selon vous, n'implique aucun type d'algorithme de traversée de données, ni insertion ni recherche (clause WHERE). Mais vous devriez dans le cas contraire. Par défaut, vous devez indexer tous les champs. Les champs que vous devriez envisager de désindexer sont les suivants: si les requêtes sont utilisées uniquement par le modérateur, sauf si elles ont également besoin de vitesse
la source
cette réponse est basée sur mon opinion personnelle J'utilise ma logique mathématique pour répondre
la deuxième question portait sur la frontière où s'arrêter, commençons par faire un calcul mathématique, supposons que nous ayons N lignes avec L champs dans une table si nous indexons tous les champs, nous obtiendrons un L nouvelles tables d'index où chaque table triera dans un manière significative les données du champ d'index, à première vue si votre table est un poids W cela deviendra W * 2 (1 tera deviendra 2 tera) si vous avez 100 grande table (j'ai déjà travaillé dans un projet où le numéro de table était autour de 1800 table) vous gaspillerez 100 fois cet espace (100 téra), c'est loin d'être sage.
Si nous appliquons des index dans toutes les tables, nous devrons penser aux mises à jour d'index si un déclencheur de mise à jour, tous les index sont mis à jour, il s'agit d'une sélection de tous les équivalents non ordonnés dans le temps
à partir de là je conclus que vous avez dans ce scénario que si vous perdez ce temps est préférable de le perdre dans une sélection ni une mise à jour car si vous sélectionnez un champ qui n'est pas indexé vous ne déclencherez pas une autre sélection sur tous les champs qui sont non indexé
quoi indexer?
clés étrangères: est un must basé sur
clé primaire: je ne sais pas encore si quelqu'un a lu ceci pourrait aider dans ce cas
autres champs: la première réponse naturelle est la moitié des champs restants pourquoi: si vous devez indexer plus vous n'êtes pas loin de la meilleure réponse si vous devez moins indexer vous n'êtes pas aussi loin car nous savons qu'aucun index n'est mauvais et que tout est indexé est également mauvais.
à partir de ces 3 points, je peux conclure que si nous avons L champs composés de K clés, la limite devrait être quelque part
((L-K)/2)+K
plus ou moins proche de L / 10cette réponse est basée sur ma logique et mes prictices personnels
la source
Ce n'est pas une bonne idée d'indexer toutes les colonnes d'une table. Bien que cela rende la table très rapide à lire, elle devient également beaucoup plus lente à écrire. L'écriture dans une table dont chaque colonne est indexée impliquerait de placer le nouvel enregistrement dans cette table, puis de placer les informations de chaque colonne dans sa propre table d'index.
la source