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