22.Temps d'execution
22.1.Introduction:
L'objectif de ce chapitre est de prendre conscience des temps d'execution induits par le choix de tel ou tel attribut dans une base de données.
Pour cela, des mesures ont été réalisées sur une base de données MySQL, via des scripts PHP, sous le système d'exploitation Linux, sur une machine de performance modeste (PC AMD 350MHz, 192Mo de mémoire, DD IBM-DLTA 30Go sur UDMA33).
Les temps d'execution n'ont pas de signification en soit (car ils dépendent beaucoup du système) par contre les temps relatifs permettent de tirer des enseignements.
Les résultats complets sont disponibles à la fin de ce chapitre.
22.2.Dimensionnement:
Pour commencer, nous avons simplement inseré 200 enregistrements dans une table ne contenant qu'un simple champs de type entier. Puis nous avons lu (requête SELECT) 20 de ces enregistrements et effectué 2 opérations (SUM et COUNT).
L'insertion a demandé un dixième de seconde. La lecture a demandé 2 centièmes de seconde (soit à peu près un millième de seconde par enregistrement lu). Quant aux 2 opérations, elles ont chacune demandé moins d'un centième de seconde.
Conclusion: Une base de données est conçue pour traiter un très grand nombre d'enregistrements. Dans ce contexte, une table de 200 enregistrements peut être considérée comme de taille négligeable.
22.3.Avec ou Sans index:
Ensuite, nous avons voulu démontrer l'utilité (ainsi que la contre-partie) d'indexer les champs sur lequels portent les requêtes.
Pour cela, nous avons inséré dans différentes tables (indexées ou non), un nombre croissant d'enregistrements. Enregistrements que nous avons par la suite lu par 20 requêtes SELECT portant chacune sur un enregistrement différent (tiré au hasard).
Nb d'enregistrements |
INSERT |
SELECT |
SUM |
SANS INDEX |
AVEC INDEX |
SANS INDEX |
AVEC INDEX |
SANS INDEX |
AVEC INDEX |
200 |
0.10 |
0.11 |
0.02 |
0.02 |
0 |
0 |
10000 |
5 |
5.9 |
0.29 |
0.02 |
0.02 |
0.04 |
100000 |
49.7 |
61.6 |
2.7 |
0.02 |
0.15 |
0.38 |
1000000 |
493 |
632 |
27 |
0.02 |
1.5 |
4.1 |
Les temps sont exprimés en secondes.
Conclusion: L'utilisation d'un index sur un champ augmente la durée de l'insertion d'un nouveau champ (temps de mise à jour de l'index) de l'ordre de 30% dans notre cas. Par contre, le temps de recherche s'en trouve considérablement réduit. Dans notre cas, il devient indépendant de la taille de la table ce qui nous donne un gain de 99.92% sur la table de 100000 enregistrements.
Plus curieusement, l'utilisation affecte également l'opération SUM dont le temps d'execution se trouve ici augmenté de 173%.
L'opération COUNT, elle, ne nécessitant pas d'accès au contenu de la table se fait toujours en un temps négligeable.
22.4.Bench MySQL
Serveur : Apache/1.3.20 (Unix) PHP/4.0.6
Machine : i386-redhat-linux-gnu
OS : linux-gnu
CPU (famille) : i386
Requête |
Fonction |
Type |
Nb d'enreg. |
Avec/Sans Index |
Résultat |
Temps d'execution en s |
Avec 200 enregistrements de type ENTIER |
INSERT |
RAND |
INTEGER |
SANS INDEX |
200 |
|
0.11 |
SELECT |
COUNT |
INTEGER |
SANS INDEX |
200 |
200 |
0 |
SELECT |
SUM |
INTEGER |
SANS INDEX |
200 |
220819392295 |
0 |
SELECT |
RAND (x20) |
INTEGER |
SANS INDEX |
200 |
|
0.02 |
INSERT |
RAND |
INTEGER |
AVEC INDEX |
200 |
|
0.12 |
SELECT |
COUNT |
INTEGER |
AVEC INDEX |
200 |
200 |
0 |
SELECT |
SUM |
INTEGER |
AVEC INDEX |
200 |
195327711409 |
0 |
SELECT |
RAND (x20) |
INTEGER |
AVEC INDEX |
200 |
|
0.02 |
Avec 200 enregistrements de type VARCHAR(32) |
INSERT |
RAND |
VARCHAR(32) |
SANS INDEX |
200 |
|
0.11 |
SELECT |
COUNT |
VARCHAR(32) |
SANS INDEX |
200 |
200 |
0 |
SELECT |
RAND (x20) |
VARCHAR(32) |
SANS INDEX |
200 |
|
0.03 |
SELECT |
LIKE %RAND% (x20) |
VARCHAR(32) |
SANS INDEX |
200 |
|
0.04 |
INSERT |
RAND |
VARCHAR(32) |
AVEC INDEX |
200 |
|
0.13 |
SELECT |
COUNT |
VARCHAR(32) |
AVEC INDEX |
200 |
200 |
0 |
SELECT |
RAND (x20) |
VARCHAR(32) |
AVEC INDEX |
200 |
|
0.03 |
SELECT |
LIKE %RAND% (x20) |
VARCHAR(32) |
AVEC INDEX |
200 |
|
0.03 |
Avec 10000 enregistrements de type ENTIER |
INSERT |
RAND |
INTEGER |
SANS INDEX |
10000 |
|
5.4 |
SELECT |
COUNT |
INTEGER |
SANS INDEX |
10000 |
10000 |
0 |
SELECT |
SUM |
INTEGER |
SANS INDEX |
10000 |
10753476197855 |
0.02 |
SELECT |
RAND (x20) |
INTEGER |
SANS INDEX |
10000 |
|
0.33 |
INSERT |
RAND |
INTEGER |
AVEC INDEX |
10000 |
|
6.4 |
SELECT |
COUNT |
INTEGER |
AVEC INDEX |
10000 |
10000 |
0 |
SELECT |
SUM |
INTEGER |
AVEC INDEX |
10000 |
10785439244020 |
0.04 |
SELECT |
RAND (x20) |
INTEGER |
AVEC INDEX |
10000 |
|
0.02 |
Avec 10000 enregistrements de type VARCHAR(32) |
INSERT |
RAND |
VARCHAR(32) |
SANS INDEX |
10000 |
|
5.5 |
SELECT |
COUNT |
VARCHAR(32) |
SANS INDEX |
10000 |
10000 |
0 |
SELECT |
RAND (x20) |
VARCHAR(32) |
SANS INDEX |
10000 |
|
0.75 |
SELECT |
LIKE %RAND% (x20) |
VARCHAR(32) |
SANS INDEX |
10000 |
|
0.99 |
INSERT |
RAND |
VARCHAR(32) |
AVEC INDEX |
10000 |
|
7.2 |
SELECT |
COUNT |
VARCHAR(32) |
AVEC INDEX |
10000 |
10000 |
0 |
SELECT |
RAND (x20) |
VARCHAR(32) |
AVEC INDEX |
10000 |
|
0.03 |
SELECT |
LIKE %RAND% (x20) |
VARCHAR(32) |
AVEC INDEX |
10000 |
|
0.88 |
Avec 100000 enregistrements de type ENTIER |
INSERT |
RAND |
INTEGER |
SANS INDEX |
100000 |
|
54.9 |
SELECT |
COUNT |
INTEGER |
SANS INDEX |
100000 |
100000 |
0 |
SELECT |
SUM |
INTEGER |
SANS INDEX |
100000 |
107351318565164 |
0.14 |
SELECT |
RAND (x20) |
INTEGER |
SANS INDEX |
100000 |
|
3.1 |
INSERT |
RAND |
INTEGER |
AVEC INDEX |
100000 |
|
66.7 |
SELECT |
COUNT |
INTEGER |
AVEC INDEX |
100000 |
100000 |
0 |
SELECT |
SUM |
INTEGER |
AVEC INDEX |
100000 |
107364378970630 |
0.39 |
SELECT |
RAND (x20) |
INTEGER |
AVEC INDEX |
100000 |
|
0.02 |
Avec 100000 enregistrements de type VARCHAR(32) |
INSERT |
RAND |
VARCHAR(32) |
SANS INDEX |
100000 |
|
54.8 |
SELECT |
COUNT |
VARCHAR(32) |
SANS INDEX |
100000 |
100000 |
0 |
SELECT |
RAND (x20) |
VARCHAR(32) |
SANS INDEX |
100000 |
|
6.9 |
SELECT |
LIKE %RAND% (x20) |
VARCHAR(32) |
SANS INDEX |
100000 |
|
8.8 |
INSERT |
RAND |
VARCHAR(32) |
AVEC INDEX |
100000 |
|
74.4 |
SELECT |
COUNT |
VARCHAR(32) |
AVEC INDEX |
100000 |
100000 |
0 |
SELECT |
RAND (x20) |
VARCHAR(32) |
AVEC INDEX |
100000 |
|
0.03 |
SELECT |
LIKE %RAND% (x20) |
VARCHAR(32) |
AVEC INDEX |
100000 |
|
8.5 |
Avec 1000000 enregistrements de type ENTIER |
INSERT |
RAND |
INTEGER |
SANS INDEX |
1000000 |
|
550 |
SELECT |
COUNT |
INTEGER |
SANS INDEX |
1000000 |
1000000 |
0 |
SELECT |
SUM |
INTEGER |
SANS INDEX |
1000000 |
1074279791784496 |
1.5 |
SELECT |
RAND (x20) |
INTEGER |
SANS INDEX |
1000000 |
|
30.7 |
INSERT |
RAND |
INTEGER |
AVEC INDEX |
1000000 |
|
689 |
SELECT |
COUNT |
INTEGER |
AVEC INDEX |
1000000 |
1000000 |
0 |
SELECT |
SUM |
INTEGER |
AVEC INDEX |
1000000 |
1073275663764586 |
4.7 |
SELECT |
RAND (x20) |
INTEGER |
AVEC INDEX |
1000000 |
|
0.02 |
Avec 1000000 enregistrements de type VARCHAR(32) |
INSERT |
RAND |
VARCHAR(32) |
SANS INDEX |
1000000 |
|
566 |
SELECT |
COUNT |
VARCHAR(32) |
SANS INDEX |
1000000 |
1000000 |
0 |
SELECT |
RAND (x20) |
VARCHAR(32) |
SANS INDEX |
1000000 |
|
70.4 |
SELECT |
LIKE %RAND% (x20) |
VARCHAR(32) |
SANS INDEX |
1000000 |
|
89.9 |
INSERT |
RAND |
VARCHAR(32) |
AVEC INDEX |
1000000 |
|
827 |
SELECT |
COUNT |
VARCHAR(32) |
AVEC INDEX |
1000000 |
1000000 |
0 |
SELECT |
RAND (x20) |
VARCHAR(32) |
AVEC INDEX |
1000000 |
|
0.03 |
SELECT |
LIKE %RAND% (x20) |
VARCHAR(32) |
AVEC INDEX |
1000000 |
|
88.6 |