Astuce MySQL : Accélérer le calcul du nombre de pages
Je travaille actuellement sur un script que tout programmeur PHP a eu à faire un jour : sélectionner des données dans une base (un gros SELECT) et couper les résultats sur plusieurs pages. Quasiment tout le monde utilise deux requêtes : une qui récupère les données avec la clause LIMIT qui va bien, et une autre qui calcule le nombre de résultats de la requête sans le LIMIT. Ca fait chercher 2 fois les infos à MySQL, c'est moche et sur des grosses tables ca peut être assez lent.
La solution consiste à insérer l'option "SQL_CALC_FOUND_ROWS" dans votre première requête ! Par exemple :
On obtient les données de la page demandée (par la clause LIMIT). Reste à savoir le nombre de résultats total, qui a déjà été calculé par MySQL grace à la fameuse option :
Et voila, cette deuxième requête sera quasi-instantanée. Pas mal non ? ;)
Note: ceci ne marche qu'à partir de MySQL 4.1
MySQL et le cache
Pour ceux qui utilisent MySQL comme système de base de données, sachez qu'il possède un cache. Ce cache permet de multiplier par 238% le temps d'exécution des requêtes d'après la doc de MySQL. Ce cache ne fonctionne bien sur que sur des requetes strictement identiques, mais c'est déjà ca pour accélérer nos scripts :)
Pour voir s'il est activé, faites ceci :
------------------------------------------
| Variable_name | Value |
|----------------------------------------|
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 0 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
------------------------------------------
Bien que la variable query_cache_type soit sur ON, query_cache_size est à zéro, ce qui se traduit dans les faits par un cache de requêtes désactivé. Mettre query_cache_type sur ON (mise en cache de toutes les requêtes SELECT sauf celles avec le mot-clé SQL_NO_CACHE) ou DEMAND (mise en cache des requêtes avec le mot-clé SQL_CACHE uniquement) et affecter à la variable query_cache_size une valeur supérieure à zéro a pour effet d'activer le cache de requêtes.
Soit par exemple dans ce cas :
Et voila, ce n'est pas bien compliqué !
Plus d'infos sur le cache de MySQL .
June 07
1