Vous devez absolument passer du temps à vous documenter sur l'indexation, il y a beaucoup d'écrits à ce sujet, et il est important de comprendre ce qui se passe.
De manière générale, un index impose un ordre aux lignes d'une table.
Pour simplifier, imaginons qu'un tableau soit 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 ayez chargé ce fichier CSV dans un tableur très rudimentaire. Tout ce que fait ce tableur est d'afficher les données et de numéroter les lignes dans un ordre séquentiel.
Imaginez maintenant que vous devez trouver toutes les lignes qui ont la 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 du tableau") peut prendre beaucoup de temps !
Imaginez maintenant qu'en plus de cette table, vous avez 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 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 le balayage de la table nécessite la recherche de N lignes (où N est le nombre de lignes), la recherche binaire ne nécessite que la recherche de log-n entrées d'index, dans le pire des cas. 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 effectuez donc un peu plus de travail lorsque vous écrivez de nouvelles lignes, mais vous gagnez un temps fou lorsque vous recherchez quelque chose.
Donc, en général, l'indexation crée un compromis entre l'efficacité de la lecture et l'efficacité de l'écriture. Sans index, les insertions peuvent être très rapides : le moteur de la base de données ajoute simplement une ligne à la table. Lorsque vous ajoutez des index, le moteur doit mettre à jour chaque index tout en effectuant l'insertion.
D'autre part, la lecture devient beaucoup plus rapide.
J'espère que cela répond à vos deux premières questions (comme d'autres l'ont fait - 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 à accélérer la lecture jusqu'au premier "%". En d'autres termes, si vous effectuez une SÉLECTION WHERE column 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 ce jeu de lignes intermédiaire pour trouver le sous-ensemble qui contient "bar". SELECT ... WHERE column LIKE '%bar%' ne peut pas utiliser l'index. J'espère que vous comprenez pourquoi.
Enfin, vous devez commencer à penser aux index sur plus d'une colonne. Le concept est le même et se comporte de la même manière que le LIKE. En gros, 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), tout comme une recherche sur (a,b). Cependant, le moteur devra effectuer un balayage complet de la table si vous recherchez WHERE b=5 AND c=1).
J'espère que cela vous aidera à y voir plus clair, mais je dois répéter qu'il est préférable de passer quelques heures à chercher de bons articles qui expliquent ces choses en profondeur. Il est également conseillé de lire la documentation de votre serveur de base de données. La façon dont les indices sont implémentés et utilisés par les planificateurs de requêtes peut varier assez largement.
6 votes
Vous devriez probablement retaguer la question. Le choix des index est un élément important pour l'optimisation de tout modèle de base de données. Et à mon avis sans rapport avec php.
0 votes
dev.mysql.com/doc/refman/5.5/fr/mysql-indexes.html
0 votes
stackoverflow.com/q/3567981/3404097