Vous devriez certainement passer un peu de temps à lire sur l'indexation, il y a beaucoup d'écrits à 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'un tableau est juste un gros fichier CSV. Chaque fois qu'une ligne est insérée, elle est insérée à la fin . Ainsi, l'ordre "naturel" du tableau est simplement l'ordre dans lequel les lignes ont été insérées.
Imaginez que vous ayez ce fichier CSV chargé dans un tableur très rudimentaire. Tout ce que fait cette feuille de calcul est d'afficher les données et de numéroter les lignes dans un ordre séquentiel.
Imaginez maintenant que vous deviez 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 parcourez 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 "balayage de table") peut prendre beaucoup de temps !
Imaginez maintenant qu'en plus de cette table, vous ayez un index. Cet index particulier est l'index des valeurs de 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'entre elles, fournit une liste de 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 à rechercher N lignes (où N est le nombre de lignes), la recherche binaire nécessite uniquement que vous regardiez les entrées d'index log-n, dans le pire des cas. Wow, c'est sûr que c'est 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 gagnez beaucoup de temps lorsque vous cherchez 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.
D'autre part, les lectures deviennent beaucoup plus rapides.
J'espère que cela couvre vos deux premières questions (comme d'autres y 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 la colonne WHERE LIKE '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 comprendrez 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 le truc 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 peut utiliser l'index (a,b,c), comme le ferait une recherche sur (a,b). Cependant, le moteur aurait besoin de faire une analyse complète de la table si vous recherchiez WHERE b=5 AND c=1)
J'espère que cela aide à éclairer un peu, mais je dois répéter que vous feriez mieux de passer quelques heures à chercher de bons articles qui expliquent ces choses en profondeur. C'est aussi 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.