Astuce MySQL : Accélérer le calcul du nombre de pages

09/06/2007 at 09:59 - [FR]

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 :

mysql> SELECT SQL_CALC_FOUND_ROWS mes_champs_a_selectionner FROM ma_table WHERE ma_condition LIMIT ma_limite;

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 :

mysql> SELECT FOUND_ROWS();

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

09/06/2007 at 09:39 - [FR]

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 :

mysql> show variables like 'query%';
------------------------------------------
| 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 :

SET global query_cache_size = 250000000;

Et voila, ce n'est pas bien compliqué !

Plus d'infos sur le cache de MySQL .

June 07

1