Vous devriez certainement passer du temps à lire sur l'indexation, il y a beaucoup d'écrit à ce sujet et il est important de comprendre ce qui se passe.
D'une manière générale, un index impose un ordre sur les lignes d'une table.
Par souci de simplicité, imaginez qu'une table n'est qu'un gros fichier CSV. Chaque fois qu'une ligne est insérée, elle est insérée à la fin . Ainsi, l'ordre "naturel" de la table est simplement l'ordre dans lequel les lignes ont été insérées.
Imaginez que vous avez ce fichier CSV chargé dans une application de feuille de calcul très rudimentaire. Cette feuille de calcul n'affiche que les données et numérote les lignes dans un ordre séquentiel.
Imaginez maintenant que vous devez trouver toutes les lignes qui ont une valeur "M" dans la troisième colonne. Compte tenu de ce dont vous disposez, vous n'avez qu'une seule option. Vous scannez le tableau en vérifiant la valeur de la troisième colonne pour chaque ligne. Si vous avez beaucoup de lignes, cette méthode (un "scan de table") peut prendre beaucoup de temps!
Imaginez maintenant qu'en plus de ce tableau, vous avez un index. Cet index particulier est l'indice des valeurs dans la troisième colonne. L'index répertorie toutes les valeurs de la troisième colonne, dans un ordre significatif (par exemple, par ordre alphabétique) et pour chacune d'elles, fournit une liste des numéros de ligne où cette valeur apparaît.
Vous avez maintenant une bonne stratégie pour trouver toutes les lignes où la valeur de la troisième colonne est "M". Par exemple, vous pouvez effectuer une recherche binaire ! Alors que l'analyse de table vous oblige à regarder N lignes (où N est le nombre de lignes), la recherche binaire ne nécessite que de regarder les entrées d'index log-n, dans le pire des cas. Wow, c'est sûr beaucoup plus facile!
Bien sûr, si vous avez cet index et que vous ajoutez des lignes à la table (à la fin, puisque c'est ainsi que fonctionne notre table conceptuelle), vous devez mettre à jour l'index à chaque fois. Vous faites donc un peu plus de travail pendant que vous écrivez de nouvelles lignes, mais vous économisez une tonne de temps lorsque vous recherchez quelque chose.
Ainsi, en général, l'indexation crée un compromis entre l'efficacité de lecture et l'efficacité d'écriture. Sans index, les insertions peuvent être très rapides - le moteur de base de données ajoute simplement une ligne à la table. Lorsque vous ajoutez des index, le moteur doit mettre à jour chaque index lors de l'insertion.
En revanche, les lectures deviennent beaucoup plus rapides.
J'espère que cela couvre vos deux premières questions (comme d'autres l'ont répondu - vous devez trouver le bon équilibre).
Votre troisième scénario est un peu plus compliqué. Si vous utilisez LIKE, les moteurs d'indexation vous aideront généralement avec votre vitesse de lecture jusqu'au premier "%". En d'autres termes, si vous SÉLECTIONNEZ O WH la colonne COMME 'foo% bar%', la base de données utilisera l'index pour trouver toutes les lignes où la colonne commence par "foo", puis devra analyser cet ensemble de lignes intermédiaire pour trouver le sous-ensemble qui contient "bar". SELECT ... WHERE colonne LIKE '% bar%' ne peut pas utiliser l'index. J'espère que vous pouvez voir pourquoi.
Enfin, vous devez commencer à penser aux index sur plusieurs colonnes. Le concept est le même et se comporte de la même manière que les éléments LIKE - essentiellement, si vous avez un index sur (a, b, c), le moteur continuera à utiliser l'index de gauche à droite du mieux qu'il peut. Ainsi, une recherche sur la colonne a pourrait utiliser l'index (a, b, c), tout comme une sur (a, b). Cependant, le moteur devrait effectuer une analyse complète de la table si vous recherchiez O = b = 5 ET c = 1)
J'espère que cela vous aidera à jeter un peu de lumière, mais je dois répéter que vous feriez mieux de passer quelques heures à fouiller pour trouver de bons articles qui expliquent ces choses en profondeur. C'est également une bonne idée de lire la documentation de votre serveur de base de données particulier. La façon dont les index sont implémentés et utilisés par les planificateurs de requêtes peut varier assez largement.