Supposons que nous ayons une base de données d'étudiants avec numéro de rouleau, nom et marques comme attributs. Sur les deux requêtes suivantes que l'on est rapide: Sélectionnez Roll_Number à partir d'étudiants CODE>
Sélectionnez Nom à partir d'étudiants CODE>? P>
5 Réponses :
Il n'y a pas de condition, les deux requêtes prendront environ la même heure p>
La colonne qui est indexée va chercher des données plus rapidement. p>
Si aucune de vos colonnes n'est indexée, car il n'y a aucune condition dans les deux requêtes, les deux requêtes à prendre en même temps en fonction de la vitesse de connectivité réseau à la base de données. P>
C'est ce que j'ai mentionné, si aucune des colonnes n'est indexée, il ne fera aucune différence, par conséquent, les deux requêtes prendront la même heure
Je sais, il n'y a aucune condition dans les deux requêtes, donc celles-ci à prendre en même temps, c'est ce que j'ai expliqué aussi.
Vous pouvez mesurer le temps d'exécution de la requête comme, P>
Parse SQL Server and Compiler Time: P>
temps CPU = 0 ms, temps écoulé = 1 ms. p>
(1 rangée (s) affectée (s)) p>
Temps d'exécution SQL Server: P>
Temps CPU = 422 ms, temps écoulé = 2296 ms. P> définir le temps de statistiques sur; code> p>
Sélectionnez Roll_Number à partir d'étudiants; code>
ou
Sélectionnez Nom des étudiants CODE> P>
Vous récupérez efficacement toutes les valeurs de cette colonne dans la table, pas de filtres et pas de pagination. Les deux requêtes seront répondues par une "balayage de la table complète", mais aucune requête n'est évaluée de manière plus optimale. Sinon, si vous contraindrez la requête avec des filtres et une pagination, alors comme mentionné ci-dessus, la colonne indexée sera extraite plus rapidement. P>
Il n'y aurait aucune différence significative. Vous pouvez facilement tester cela par vous-même. De même, la présence ou l'absence d'un indexé sur une colonne donnée ne ferait aucune différence - sauf que les lignes d'une colonne indexée seraient types - bien que MySQL ne garantit aucune garantie à cet égard:
DROP TABLE IF EXISTS x;
CREATE TABLE x
(indexed_int INT NOT NULL
,unindexed_int INT NOT NULL
,indexed_string VARCHAR(3) NOT NULL
,unindexed_string VARCHAR(3) NOT NULL
,INDEX(indexed_int)
,INDEX(indexed_string)
);
--Populate with roughly 100,000 rows of random data...
INSERT INTO x
SELECT RAND()*100000
, RAND()*100000
, 100+(RAND()*900)
, 100+(RAND()*900);
INSERT INTO x SELECT RAND()*100000, RAND()*100000, 100+(RAND()*900), 100+(RAND()*900) FROM x;
-- repeat line above a bunch of times. Then...
SELECT indexed_int FROM x;
131072 rows in set (0.20 sec)
SELECT unindexed_int FROM x;
131072 rows in set (0.22 sec)
SELECT indexed_string FROM x;
131072 rows in set (0.23 sec)
SELECT unindexed_string FROM x;
131072 rows in set (0.18 sec)
Le temps de traitement EM> pour les deux requêtes doit être fondamentalement identique. La requête doit lire toutes les lignes et ce sera une balayage de table complète. P>
Un index pourrait aider. Si un index est sur la colonne, seul seul l'index doit être lu plutôt que les pages de données. C'est une assez petite optimisation. P>
Cependant, la récupération des données dépendra de la taille des données de la colonne. Et cela pourrait varier sensiblement si, disons, roll_number code> où un nom Int et code> était une très longue chaîne. P>