Lors de l'interaction avec une base de données à l'aide de PHP, PDO (PHP Data Objectts) est un moyen très courant d'accéder aux bases de données. Il fournit des fonctions puissantes, dont l'une est la fonction Pdostation :: ColumnCount . Cette fonction est utilisée pour obtenir le nombre de colonnes dans l'ensemble de résultats, et nous l'utilisons généralement pour effectuer un certain traitement lors de l'obtention des données. Cependant, lorsque vous traitez de grands ensembles de résultats, un appel fréquent à ColumnCount apportera des problèmes de performances considérables, en particulier lorsque la quantité de données est importante, plus d'appels réduiront considérablement l'efficacité du programme.
Dans cet article, nous discuterons de la façon d'éviter les goulets d'étranglement des performances causés par des appels fréquents à la fonction PDOSTATION :: ColumnCount et fournissent quelques suggestions d'optimisation.
Avant de commencer l'optimisation, nous devons d'abord comprendre comment fonctionne la fonction Pdostatement :: ColumnCount . Cette fonction renvoie le nombre de colonnes dans le jeu de résultats actuel. Lorsqu'une requête est exécutée et que l'ensemble de résultats est récupéré, le PDO effectue une série d'opérations de base de données, la lecture des métadonnées pour obtenir des informations sur la colonne. Lorsque vous appelez ColumnCount , PDO renvoie le nombre de colonnes qui ont été récupérées.
Si vous appelez ColumnCount chaque fois que lorsque vous travaillez avec de grands ensembles de données, cela signifie que vous devez effectuer une certaine opération de base de données à chaque fois, bien que dans de nombreux cas, vous n'avez pas besoin d'obtenir le nombre de colonnes à chaque fois. Par conséquent, un appel fréquent à cette méthode provoquera des frais généraux inutiles, en particulier lorsque le volume de données est énorme.
Si vous connaissez déjà le nombre de colonnes dans la requête lors du fonctionnement de la base de données et que vous n'avez pas besoin de modifier dynamiquement le nombre de colonnes, vous pouvez obtenir le nombre de colonnes au début de la requête et l'enregistrer dans une variable. De cette façon, lorsque vous avez besoin de comptes de colonnes, il vous suffit d'utiliser directement cette variable, sans appeler ColumnCount à chaque fois.
Par exemple:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name, age FROM users"</span></span><span>);
</span><span><span class="hljs-variable">$columnCount</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">columnCount</span></span><span>(); </span><span><span class="hljs-comment">// Obtenez le nombre de colonnes à la fois et enregistrez</span></span><span>
</span><span><span class="hljs-comment">// Vous pouvez l'utiliser directement dans le futur $columnCount,Évitez les appels répétés columnCount</span></span><span>
</span></span>
Si vous souhaitez simplement obtenir les données au lieu de vous soucier du nombre de colonnes, il est recommandé d'utiliser directement des méthodes Fetchall ou Fetch , ce qui peut éviter plusieurs appels à ColumnCount .
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name, age FROM users"</span></span><span>);
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetchAll</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>); </span><span><span class="hljs-comment">// Obtenez toutes les données directement</span></span><span>
</span><span><span class="hljs-comment">// De cette façon, vous n'avez plus besoin d'appeler columnCount</span></span><span>
</span></span>
Dans certains cas, nous voulons obtenir des données dans un format spécifique. Pdostatement :: SetFetchMode peut nous aider à définir le mode d'acquisition de données à la fois, évitez d'appeler ColumnCount à chaque fois que nous obtenons des données.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name, age FROM users"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">setFetchMode</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>); </span><span><span class="hljs-comment">// Définir un format de retour unifié</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetchAll</span></span><span>(); </span><span><span class="hljs-comment">// Obtenez des données à la fois</span></span><span>
</span><span><span class="hljs-comment">// Cela évite les appels fréquents columnCount</span></span><span>
</span></span>
Si le nombre de colonnes dans vos résultats de requête ne change pas fréquemment, considérez Cache le nombre de colonnes en une variable, en particulier dans les scénarios où la même requête est exécutée plusieurs fois. De cette façon, le nombre de colonnes dans le résultat de la requête ne doit pas être appelé ColumnCount à chaque fois, et la valeur peut être directement récupérée du cache.
Par exemple:
<span><span><span class="hljs-variable">$columnCountCache</span></span><span> = []; </span><span><span class="hljs-comment">// Utilisé pour mettre en cache le nombre de colonnes</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getColumnCount</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$stmt</span></span></span><span>) {
</span><span><span class="hljs-keyword">global</span></span><span> </span><span><span class="hljs-variable">$columnCountCache</span></span><span>;
</span><span><span class="hljs-comment">// Vérifiez si le nombre de colonnes a été mis en cache en interrogeant la valeur de hachage de l'instruction de requête</span></span><span>
</span><span><span class="hljs-variable">$queryHash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">md5</span></span><span>(</span><span><span class="hljs-variable">$stmt</span></span><span>->queryString);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$columnCountCache</span></span><span>[</span><span><span class="hljs-variable">$queryHash</span></span><span>])) {
</span><span><span class="hljs-variable">$columnCountCache</span></span><span>[</span><span><span class="hljs-variable">$queryHash</span></span><span>] = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">columnCount</span></span><span>();
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$columnCountCache</span></span><span>[</span><span><span class="hljs-variable">$queryHash</span></span><span>];
}
</span></span>
Si vous devez fonctionner sur chaque ligne de données lors du traitement de l'ensemble de résultats, assurez-vous d'éviter d'appeler ColumnCount dans la boucle. Chaque exécution de ColumnCount peut relire les métadonnées de la base de données, qui peuvent affecter les performances du programme, en particulier dans le cas de grands ensembles de données.
La bonne façon de le faire est d'obtenir le nombre de colonnes avant de traiter les données et de les enregistrer dans une variable pour une utilisation ultérieure:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name, age FROM users"</span></span><span>);
</span><span><span class="hljs-variable">$columnCount</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">columnCount</span></span><span>(); </span><span><span class="hljs-comment">// Obtenez le nombre de colonnes et enregistrez</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>)) {
</span><span><span class="hljs-comment">// Peut être utilisé ici $columnCount,Au lieu de chaque appel columnCount</span></span><span>
}
</span></span>
Lorsque l'ensemble de résultats de requête est très important, il peut non seulement affecter les performances si l'acquisition du nombre de colonnes affecte les performances, mais la quantité de données elle-même exercera également une pression sur les performances. Si le résultat renvoyé par la requête est trop important, envisagez d'utiliser l'instruction limite pour limiter le nombre de lignes renvoyées.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name, age FROM users LIMIT 1000"</span></span><span>); </span><span><span class="hljs-comment">// Limiter la taille de l'ensemble de résultats</span></span><span>
</span></span>
Bien que la méthode ColumnCount soit très pratique lors de l'utilisation de l'APD, un appel fréquent à la méthode peut entraîner des problèmes de performances lorsqu'ils traitent de grands ensembles de résultats. Pour optimiser les performances, les stratégies suivantes peuvent être prises en compte:
Obtenez le nombre de colonnes à l'avance et stockez-les;
Utilisez Fetchall ou Fetch pour obtenir des données;
Utilisez SetFetchMode pour optimiser l'acquisition de données;
Cachez le nombre de colonnes pour éviter les calculs répétés.
Grâce à ces mesures d'optimisation, vous pouvez réduire considérablement les frais généraux de performances inutiles et améliorer l'efficacité des opérations de base de données PHP.