Position actuelle: Accueil> Derniers articles> Performance de MySQLI_RESULT :: FETCH_ALL Fonction sur de grands ensembles de données

Performance de MySQLI_RESULT :: FETCH_ALL Fonction sur de grands ensembles de données

gitbox 2025-05-29

1. Le principe de travail de mysqli_result :: fetch_all

La méthode fetch_all () tire toutes les données dans le résultat des résultats en mémoire et renvoie un tableau bidimensionnel. L'avantage est que le code est simple et pratique pour la manipulation directe des tableaux; L'inconvénient est que lorsque l'ensemble de résultats est très important, la consommation de mémoire est élevée, ce qui peut faire en sorte que la réponse du programme soit ralentie ou même en termes de mémoire.

Par exemple:

 <?php
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
$result = $mysqli->query("SELECT * FROM large_table");

$data = $result->fetch_all(MYSQLI_ASSOC);
print_r($data);
?>

Dans ce code, fetch_all () lira toutes les données dans BLARD_TABLE dans le tableau de données $ à la fois.


2. Défis de performance sous un grand volume de données

Si le volume de données est petit, fetch_all () n'a presque pas d'étranglement en performances et est très efficace. Mais si l'ensemble de résultats atteint des dizaines de milliers, des centaines de milliers de lignes, ou même plus, les frais généraux de mémoire et le temps de traitement apporté par fetch_all () apparaîtront progressivement:

  • Surge d'utilisation de la mémoire : toutes les données sont chargées en même temps et l'utilisation de la mémoire est proportionnelle à la quantité de données.

  • Le temps de réponse augmente : en raison de la lecture unique des données, le processeur et la concentration de pression de mémoire peuvent entraîner un décalage.

  • Impact de la stabilité du serveur : Dans les cas extrêmes, le débordement de la mémoire et le délai d'expiration du script peuvent se produire.


3. Analyse de mesure réelle

Environnement d'essai

  • Version PHP: 7.4

  • Base de données: MySQL 8.0

  • Volume de données de test: 10 000, 100 000, 500 000 lignes

  • Matériel: 4 CPU de base, mémoire de 8 Go

Exemple de code de test

 <?php
$mysqli = new mysqli("gitbox.net", "user", "password", "test_db");

$start = microtime(true);
$result = $mysqli->query("SELECT * FROM big_table");
$data = $result->fetch_all(MYSQLI_ASSOC);
$end = microtime(true);

echo "Rows fetched: " . count($data) . "\n";
echo "Time taken: " . ($end - $start) . " seconds\n";
?>

Résultats des tests (exemple)

Volume de données Temps (secondes) Utilisation de la mémoire (MB) Remarque
10 000 0,15 30 Bonne performance
100 000 1.8 280 Considérablement ralenti
500 000 10.2 1400 Risque de mémoire élevé

D'après les résultats des tests, on peut voir que la quantité de données augmente, le temps de réponse et l'utilisation de la mémoire de fetch_all () ont augmenté linéairement ou même plus. Lors du traitement de 500 000 données, le serveur est sous une grande pression et il y a un risque de décalage.


4. Suggestions d'optimisation

  1. Évitez de lire les mégadonnées à un moment donné <br> Pour les données massives, il est recommandé de lire en lots ou de procédés en ligne par ligne. Par exemple, utilisez la boucle fetch_assoc () pour l'obtenir une par une:

     <?php
    $result = $mysqli->query("SELECT * FROM big_table");
    while ($row = $result->fetch_assoc()) {
        // Traitement ligne par ligne
    }
    ?>
    
  2. Utilisez une requête de pagination <br> Recherchez les données par lots via la limite et le décalage de SQL pour réduire la pression d'une seule demande.

  3. Conception raisonnable des structures de données <br> Réduire les champs inutiles et éviter une transmission excessive de données redondantes.

  4. Activer le cache MySQL et optimiser les instructions de requête <br> Améliorez l'efficacité de la réponse au niveau de la base de données.


5. Résumé

MySQLI_RESULT :: Fetch_all fonctionne parfaitement dans des scénarios de données petits et moyens, est facile à développer et efficacement. Cependant, face à de grands volumes de données, la mémoire et les frais généraux de temps sont significatifs et ils sont enclins à traîner. Dans les applications pratiques, il est recommandé de sélectionner raisonnablement la méthode d'acquisition de données basée sur l'échelle de données, de coopérer avec la pagination et le traitement par lots pour assurer les performances du système et la stabilité.


J'espère que cette analyse réelle peut vous aider à mieux comprendre les caractéristiques de performance de fetch_all () et à faire un plan de lecture de base de données approprié. Pour plus de connaissances sur PHP et l'optimisation des performances de la base de données, veuillez vous référer à la documentation officielle et aux meilleures pratiques de la communauté.