Lorsque vous utilisez PHP et MySQL pour les opérations de base de données, de nombreux développeurs peuvent avoir rencontré un problème: lors de l'exécution de plusieurs instructions SQL , MySQLI :: next_result () est requis, et cette fonction est souvent remise en question "ralentira la vitesse de requête"? Aujourd'hui, nous explorerons les tenants et aboutissants de cette question pour vous aider à comprendre la vérité.
Lors de l'exécution de plusieurs instructions SQL à l'aide de mysqli_multi_query () , les résultats de chaque instruction doivent être traités manuellement. À l'heure actuelle, la fonction de next_result () est de déplacer le pointeur interne vers l'ensemble de résultats de l'instruction SQL suivante:
$conn = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($conn->multi_query($sql)) {
do {
if ($result = $conn->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
} while ($conn->next_result());
}
Next_Result () n'exécute pas essentiellement une requête , mais indique au client MySQLI qui "peut obtenir le résultat suivant du serveur". Sa consommation temporelle principale vient de:
Latence du réseau (communication client-serveur)
Grand volume de données (la mémoire sera consommée lorsque l'ensemble de résultats est grand)
Traitement non essentiel (les résultats non transformés doivent également être nettoyés)
Donc, si votre requête elle-même est déjà rapide, l'appel à next_result () est presque négligeable. Mais si la requête produit une grande quantité de données, chaque mouvement de l'ensemble de résultats signifie que le résultat précédent doit être analysé et libéré, ce qui peut en effet entraîner des frais généraux supplémentaires.
Supposons que nous exécutons l'instruction multi-Quey suivante dans le test:
$sql = "
SELECT * FROM big_table_1;
SELECT * FROM big_table_2;
SELECT * FROM big_table_3;
";
Le volume de données pour chaque tableau est d'environ 50 000 lignes.
Nous effectuons deux ensembles de tests:
A: Utilisez Multi_Query () + Next_Result () pour analyser chaque résultat normalement;
B: Utilisez Multi_Query () mais seul le premier résultat est pris, et le reste est ignoré;
Les statistiques sont les suivantes (en quelques secondes):
modèle | Temps d'exécution |
---|---|
UN | 0,82 s |
B | 0,48s |
Comme vous pouvez le voir, si vous n'avez pas besoin de l'ensemble de résultats ultérieur, ce sera plus rapide si vous n'appelez vraiment pas next_result () . Mais tant que vous devez obtenir ces données, il est indispensable.
Si vous n'avez besoin que du résultat de la requête d'une instruction, essayez d'éviter d'utiliser Multi_Query () :
// Plus de moyen recommandé
$result = $conn->query("SELECT * FROM users");
Lorsque vous utilisez Multi_Query () , contrôlez autant que possible la quantité de données renvoyées par chaque instruction de requête. Par exemple, sélectionnez uniquement les champs nécessaires ou utilisez la limite pour limiter le nombre:
SELECT id, name FROM users LIMIT 100;
Assurez-vous d'appeler $ result-> free () après store_result () pour éviter l'accumulation de mémoire, en particulier lorsqu'il est utilisé dans les boucles.
Next_result () lui-même ne "ralentit pas la requête", elle n'est qu'une partie du processus;
Ce qui affecte vraiment la vitesse, c'est la quantité de données et si vous avez vraiment besoin de tous les résultats;
Si vous n'avez besoin que d'une seule requête, veuillez éviter Multi_Query () ;
Si vous avez besoin d'un traitement de résultats multiples, next_result () est votre bonne aide.
Pour une analyse des performances plus approfondie, veuillez visiter notre rapport de comparaison détaillé sur https://gitbox.net/articles/db-performance .