Lorsque vous utilisez PHP pour manipuler les bases de données MySQL, MySQL_Fetch_Array est une fonction couramment utilisée pour obtenir la ligne de données par ligne à partir de l'ensemble de résultats de requête. Lorsque le jeu de résultats est très grand, l'utilisation de MySQL_Fetch_Array peut conduire directement à des goulots d'étranglement de performances, à une empreinte de mémoire élevée et même à une réponse de page lente. Cet article combinera des exemples de code spécifiques pour décrire comment traiter et optimiser efficacement les performances lors du retour de longs ensembles de résultats.
mysql_fetch_array consiste à récupérer les données de la ligne de définition des résultats ligne par ligne. Bien qu'il évite de lire toutes les données en mémoire à la fois, si le résultat de la requête lui-même est trop grand, il occupera toujours une grande quantité de ressources.
Idées d'optimisation :
Requête de pagination, limitant la quantité de données renvoyées en une seule fois
Utilisez la requête du curseur pour traiter les données étape par étape
La pagination est une méthode courante pour traiter les ensembles de résultats longs. Grâce à la limite et au décalage , le nombre de bandes de données est contrôlé à chaque fois pour éviter les explosions de mémoire.
<?php
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
$limit = 100; // Nombre de barres par page
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$offset = ($page - 1) * $limit;
$sql = "SELECT * FROM large_table LIMIT $limit OFFSET $offset";
$result = $mysqli->query($sql);
while ($row = mysql_fetch_array($result)) {
// Traiter chaque rangée de données
print_r($row);
}
?>
Cela divisera les données en morceaux plus petits et les traitera par lots, réduisant la pression du serveur.
Les fonctions de la série MySQL_ * ont été abandonnées depuis PHP 5.5. Il est recommandé d'utiliser MySQLI ou PDO . Ils réussissent mieux et prennent en charge les déclarations de prétraitement.
Par exemple, en utilisant mysqli_fetch_array :
<?php
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
$sql = "SELECT * FROM large_table";
$result = $mysqli->query($sql);
while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
// Traiter chaque rangée de données
print_r($row);
}
?>
Évitez de sélectionner * , interrogez uniquement les champs qui sont vraiment nécessaires, en réduisant le transfert de données et la consommation de mémoire.
$sql = "SELECT id, name, email FROM large_table LIMIT 100";
Assurez-vous que les champs des conditions de requête ont un index approprié, évitez le balayage complet et améliorez la vitesse de la requête.
CREATE INDEX idx_name ON large_table(name);
Si la base de données le prend en charge, vous pouvez utiliser des curseurs ou des procédures stockées pour traiter les données une par une du côté de la base de données pour réduire l'utilisation de la mémoire du côté PHP.
Pour les scripts qui ont besoin de traiter de grandes quantités de données, les limites de mémoire et le temps d'exécution peuvent être temporairement augmentées, mais ce n'est qu'une méthode de secours, pas une solution fondamentale.
ini_set('memory_limit', '512M');
set_time_limit(300);
Évitez de charger toutes les données à la fois, en hiérarchiser la pagination ou le traitement par lots
Sélectionnez uniquement les champs nécessaires pendant la requête pour éviter de sélectionner *
Assurer que la requête de base de données a une prise en charge de l'index et améliorer l'efficacité de la requête
Réduire la pression latérale PHP à l'aide de curseurs côté serveur ou de procédures stockées
Ajustez rationnellement la configuration de PHP comme mesure d'optimisation supplémentaire
Grâce aux méthodes ci-dessus, les performances et l'efficacité de l'utilisation de mysql_fetch_array pour traiter les ensembles de résultats longs peuvent être considérablement améliorés.