Cet article peut intéresser tous les développeurs de sites dynamiques utilisant PHP avec MySQL et dotés d’un fort trafic.
Le but de cet article : vous apprendre à augmenter la vitesse d’affichage des pages en optimisant l’interaction entre PHP et MySQL.
Il y a trois points à prendre en compte afin d’accélérer la liaison PHP-MySQL :
– Réduire le nombre de requêtes SQL
– Optimiser les requêtes
– Alléger la BDD
Ces méthodes sont classées de la plus proche du PHP en se rapprochant de MySQL :
Réduire le nombre de requêtes SQL faites par PHP
Évitez au maximum de faire appel à la Base De Données (DBB) : c’est la meilleure façon de ne pas perdre de temps avec cette jonction.
À chaque requête demandée à la BDD, le chargement de la page perd au minimum 0,006 seconde, ce qui semble peu, mais un site à forte audience doit comporter de nombreuses informations afin d’être attractif.
Mettre en cache les blocs d’informations récurrentes
Les sites possédant un bloc menu avec des informations dynamiques calculées à la volée (comme un compteur d’articles dans un menu de catégorie) peuvent être optimisés.
L’idée est de remplacer le code du générateur de menu par l’inclusion d’un fichier HTML vide, qui servira de cache.
<div id="menu"><?php include('cache/menu.html');?></div>
Afin de remplir ce cache, on va créer un fichier PHP permettant de générer le menu et de l’écrire dans le fichier menu.html.
La dernière étape consiste à faire appel au fichier PHP à chaque fois qu’un article est modifié, ajouté ou supprimé.
Optimiser les requêtes SQL
Toutes les requêtes n’ont pas le même temps d’exécution . C’est pourquoi il est bon d’employer de bonnes pratiques.
Bonnes pratiques
– Si vous devez utiliser un SELECT : demandez à la base de données de renvoyer uniquement les champs dont vous avez besoin. Les SELECT(*) sont à bannir.
– Si vous faites une opération sur une seule ligne : n’oubliez pas la commande SQL : LIMIT 0 , 1
Cela va arrêter l’exécution de la requête dès le premier résultat trouvé.
– Si vous devez compter plusieurs valeurs en une seule requête :
SELECT(SELECT COUNT(champs) FROM table1 AS comptage1, SELECT COUNT(champs2) FROM table3 AS comptage)
– N’utilisez pas d’apostrophe pour les nombres, cela force le SGBD à faire la conversion chaîne en nombre : WHERE `nombre` = 7
– Utilisez la commande LIKE '%recherche'
uniquement pour la recherche à l’intérieur d’une chaîne. Pour la recherche exacte, utilisez la commande =
.
– Sécurisez la BDD en amont avec les requêtes stockées.
– Si vous devez faire beaucoup de fois une requête avec peu de variables qui changent, utilisez les requêtes préparées :
$superrequete= mysql->PREPARE 'INSERT INTO table VALUES (?,?;?)';
$superrequete->BindParam('1er valeur');
$superrequete->BindParam('2er valeur');
$superrequete->BindParam('3er valeur');
$superrequete->execute();
Le SGBD a alors déjà mâché la requête avant de l’exécuter.
Alléger la base de données
Ne pas enregistrer les informations calculables
Lors de l’élaboration de votre BDD, ne créez pas de champ contenant le résultat d’une information calculable, par exemple un champ nommé « nombre d’articles » dans la table « catégorie ».
Nettoyer les tables
Si dans votre base de données, vous avez des tables comportant plus de 25 000 lignes, il est bon de les alléger.
En pratique, cela consiste à se rendre dans la BDD > sélectionner les tables > opérations :
- Vérifier les tables (élimine les doublons et erreurs éventuelles)
- Optimiser les tables (vérifie la longueur des champs correspondant aux données)
- Défragmenter les tables (réorganise les informations des tables sur le serveur)
Suite à ces opérations, les tables seront plus facilement lisibles par votre serveur.
Si vous souhaitez avoir des précisions, n’hésitez pas à commenter !
Tu me parles chinois là, donc en appliquant seulement ces précautions, les pages des sites web s’affichent plus vites ??
Bonjour,
il n’y a pas que ces conseils à mettre en œuvre pour accélérer un site web,
je ne parle que de l’interaction entre PHP et MySQL sur des sites à forte audience.
Ce n’est qu’un point à surveiller parmi tant d’autres, mais pas le plus simple à appliquer et ce sujet méritait un article.
Et pourquoi ne pas faire un cache de la BDD en XML qu’ont met à jour chaque modification et pour la lecture du site on lit que le XML ?
C’est une idée, qu’en penses tu Mathieu ??
C’est déjà utilisé Feyder, pour cela on utilise plutôt le format JSON que le XML afin d’améliorer le poids du fichier.
Plus le fichier est lourd, plus cela ralentira l’affichage de la page.
Ton procédé Feyder est souvent utilisé pour les sites en AJAX afin que l’on puisse utiliser le site de façon autonome entre le navigateur et le fichier XML.
Ainsi on ne recharge la page que lorsqu’une action modifiant la BDD est commise.
PS: je dis AJAX mais le jQuery est tout à fait apte à le faire :)