0Pricing
PHP Academy · Leçon

Optimiser les requêtes de base de données

Repérer les requêtes N+1, ajouter des index et réduire le nombre de requêtes.

Optimiser les requêtes de base de données est une leçon PHP Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage PHP Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours PHP Academy comprend 4 leçons au total.

Identifier les requêtes lentes

Activez le journal des requêtes lentes de MySQL et définissez un seuil. Examinez les requêtes qui prennent plus de temps que prévu.

# my.cnf:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 0.5  # log queries over 500ms

EXPLAIN / EXPLAIN ANALYZE

Utilisez EXPLAIN pour comprendre comment MySQL exécute une requête et vérifier si des index sont utilisés.

-- Run in MySQL:
EXPLAIN SELECT * FROM orders WHERE user_id = 42 AND status = "pending";
-- Look for: type=ALL (full scan), key=NULL (no index used)

Ajout d’index

Les index accélèrent considérablement les lectures sur les colonnes filtrées et triées.

-- Add composite index for the query above:
ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);

// In Laravel migration:
$table->index(["user_id", "status"]);

Problème des requêtes N+1

Le problème N+1 exécute une requête pour obtenir une liste, puis une requête par élément pour une relation. Corrigez-le avec le chargement anticipé.

<?php
// BAD: 1 + N queries
$posts = Post::all();
foreach ($posts as $post) echo $post->author->name;

// GOOD: 2 queries
$posts = Post::with("author")->get();
foreach ($posts as $post) echo $post->author->name;

Sélectionner uniquement les colonnes nécessaires

Évitez SELECT * : récupérez uniquement les colonnes dont vous avez besoin afin de réduire l’utilisation de la mémoire et le transfert réseau.

<?php
// Bad:
$users = User::all();

// Good:
$users = User::select("id", "name", "email")->get();

Traitement par blocs des grands ensembles de données

Traitez les grands ensembles de résultats par blocs pour éviter l’épuisement de la mémoire.

<?php
User::chunk(500, function ($users) {
    foreach ($users as $user) {
        // process each user
    }
});

// Or lazy loading (PHP generator):
User::lazy()->each(fn($user) => processUser($user));

Mise en cache des requêtes

Mettez en cache les agrégations et les rapports coûteux qui ne changent pas fréquemment.

<?php
$revenue = Cache::remember("monthly-revenue", 3600, function () {
    return Order::whereMonth("created_at", now()->month)->sum("total");
});

Éviter les requêtes dans les boucles

N’exécutez jamais de requêtes dans des boucles parcourant les éléments. Rassemblez d’abord les identifiants, puis récupérez-les en une seule requête.

<?php
// Collect all product IDs:
$ids = array_column($cartItems, "product_id");
// One query:
$products = Product::whereIn("id", $ids)->get()->keyBy("id");

foreach ($cartItems as $item) {
    $product = $products[$item["product_id"]];
}

Mutualisation des connexions à la base de données

PHP-FPM crée une nouvelle connexion PDO par processus d’exécution. PgBouncer ou ProxySQL peut mutualiser les connexions afin d’éviter de surcharger la base de données avec le coût de création des connexions.

Index couvrants

Un index couvrant contient toutes les colonnes nécessaires pour satisfaire une requête. MySQL peut répondre à la requête à partir du seul index, sans accéder aux lignes de la table principale.

Résumé

Activez les journaux des requêtes lentes. Utilisez EXPLAIN pour trouver les index manquants. Chargez les relations à l’avance. Sélectionnez uniquement les colonnes nécessaires. Traitez les grands ensembles de données par blocs. Mettez en cache les agrégations coûteuses. Évitez les requêtes dans les boucles.

Vérification rapide

Qu’est-ce que le problème des requêtes N+1 ?

Questions Fréquemment Posées

La leçon « Optimiser les requêtes de base de données » est-elle gratuite ?

Oui — le texte complet de « Optimiser les requêtes de base de données » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours PHP Academy, passe à CoddyKit PRO. Le cours PHP Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Optimiser les requêtes de base de données » ?

Repérer les requêtes N+1, ajouter des index et réduire le nombre de requêtes. Tu pratiques PHP Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer PHP Academy ?

Aucune expérience préalable n'est requise. PHP Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Optimiser les requêtes de base de données » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon PHP Academy ?

Oui. Chaque leçon PHP Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Profiler PHP avec Xdebug
  2. OPcache : mise en cache du bytecode
  3. Optimiser les requêtes de base de données
  4. Gestion de la mémoire et conseils de performance
← Retour à PHP Academy