La requête de jeu multi-résultats fait référence à la situation où une seule requête SQL renvoie plusieurs ensembles de résultats. En règle générale, cette requête est effectuée par ( semi-colon) séparant plusieurs instructions SQL. Par exemple:
<span><span><span class="hljs-keyword">SELECT</span></span><span> </span><span><span class="hljs-operator">*</span></span><span> </span><span><span class="hljs-keyword">FROM</span></span><span> table1;
</span><span><span class="hljs-keyword">SELECT</span></span><span> </span><span><span class="hljs-operator">*</span></span><span> </span><span><span class="hljs-keyword">FROM</span></span><span> table2;
</span></span>La requête ci-dessus renverra deux ensembles de résultats. Pour MySQL, la requête SET multi-Result peut être effectuée via la fonction mysqli_multi_query () et passez au résultat suivant défini via mysqli_next_result () .
Dans l'extension MySQLI , MySQLI_STMT :: STORE_RESULT () est une fonction utilisée pour stocker les résultats de la requête du serveur au client. Cela signifie que les données de l'ensemble de résultats de requête sont complètement chargées à partir du serveur de base de données dans la mémoire du client. Pour les scénarios où les données sont accessibles plusieurs fois, Store_Result () peut améliorer les performances car elle évite d'interagir avec le serveur de base de données chaque fois que les données sont lues.
Lors de l'exécution de requêtes de définition multi-résultats, chaque ensemble de résultats renvoie les données indépendamment. Si vous utilisez Store_Result () à tort, les problèmes suivants peuvent être causés:
Empreinte à mémoire élevée : si l'ensemble de résultats de requête est très grand, l'appel Store_Result () chargera l'ensemble des résultats en mémoire, ce qui peut entraîner une empreinte de mémoire excessive.
L'ensemble de résultats n'est pas entièrement lu : dans une requête de jeu multi-résults, si mysqli_next_result () et store_result () ne sont pas correctement appelés, certains ensembles de résultats peuvent ne pas être entièrement lus, ce qui entraîne des erreurs dans les requêtes suivantes.
Problème d'efficacité de l'exécution : Étant donné que chaque requête nécessite un ensemble de données complet à charger à partir de la base de données, une utilisation excessive de Store_Result () apportera un fardeau de performance.
Tout d'abord, la fonction MySQLI_MULTI_QUERY () doit être utilisée pour effectuer des requêtes de définition multi-résults. Cette fonction nous permet d'exécuter plusieurs instructions SQL et de renvoyer plusieurs ensembles de résultats. Lorsque vous l'utilisez, un point clé doit être noté: MySQLI_MULTI_QUERY () renverra tous les résultats de la requête, mais il ne traitera pas automatiquement l'ensemble de résultats. Vous devez parcourir manuellement chaque ensemble de résultats via mysqli_next_result () .
<span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$user</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$dbname</span></span><span>);
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM table1; SELECT * FROM table2;"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">multi_query</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>)) {
</span><span><span class="hljs-keyword">do</span></span><span> {
</span><span><span class="hljs-comment">// Obtenez l'ensemble de résultats actuel</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">store_result</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">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_assoc</span></span><span>()) {
</span><span><span class="hljs-comment">// Traiter chaque rangée de données</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Data: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'column_name'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span><span><span class="hljs-variable">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">free</span></span><span>(); </span><span><span class="hljs-comment">// Libérez l'ensemble de résultats actuel</span></span><span>
}
} </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">next_result</span></span><span>()); </span><span><span class="hljs-comment">// Obtenez le prochain ensemble de résultats</span></span><span>
}
</span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span></span>Étant donné que Store_Result () charge l'ensemble des résultats de la requête en mémoire, il peut y avoir une mémoire insuffisante lors du traitement de grandes quantités de données. Afin de gérer efficacement la mémoire, il est recommandé d'utiliser $ result-> free () pour libérer l'espace mémoire après le traitement de chaque jeu de résultats.
Toutes les requêtes ne nécessitent pas l'utilisation de store_result () , surtout lorsque seuls les résultats de la requête doivent être lus en même temps. Pour des requêtes de sélection simples, si vous avez seulement besoin d'obtenir une partie des données et que les résultats de la requête sont petits, vous pouvez envisager d'utiliser bind_result () ou fetch () directement pour obtenir les données au lieu d'utiliser store_result () . Cela réduit la consommation de mémoire.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM table1"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_result</span></span><span>(</span><span><span class="hljs-variable">$column1</span></span><span>, </span><span><span class="hljs-variable">$column2</span></span><span>);
</span><span><span class="hljs-keyword">while</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>()) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Data: "</span></span><span> . </span><span><span class="hljs-variable">$column1</span></span><span> . </span><span><span class="hljs-string">", "</span></span><span> . </span><span><span class="hljs-variable">$column2</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span></span>Si un ensemble de résultats est très grand, envisagez de diviser la requête en plusieurs requêtes de pagination. En limitant le nombre d'enregistrements renvoyés par requête, la quantité de données chargée en un seul temps sera réduite, augmentant ainsi l'efficacité et réduisant l'utilisation de la mémoire.
<span><span><span class="hljs-variable">$page</span></span><span> = </span><span><span class="hljs-number">1</span></span><span>;
</span><span><span class="hljs-variable">$perPage</span></span><span> = </span><span><span class="hljs-number">10</span></span><span>;
</span><span><span class="hljs-variable">$offset</span></span><span> = (</span><span><span class="hljs-variable">$page</span></span><span> - </span><span><span class="hljs-number">1</span></span><span>) * </span><span><span class="hljs-variable">$perPage</span></span><span>;
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM table1 LIMIT <span class="hljs-subst">$offset</span></span></span><span>, </span><span><span class="hljs-subst">$perPage</span></span><span>";
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-variable">$sql</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">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_assoc</span></span><span>()) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Data: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'column_name'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span></span>Afin d'assurer une utilisation efficace de Store_Result () dans des requêtes de jeu multi-résultats, vous pouvez ajouter une surveillance du temps d'exécution au code pour aider à déterminer si une requête a provoqué des goulots d'étranglement des performances. Si la requête est trop lente, vous pouvez envisager d'optimiser les instructions SQL ou de les effectuer étape par étape.
<span><span><span class="hljs-variable">$start_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">microtime</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-comment">// Exécuter une requête</span></span><span>
</span><span><span class="hljs-variable">$end_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">microtime</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Query Time: "</span></span><span> . (</span><span><span class="hljs-variable">$end_time</span></span><span> - </span><span><span class="hljs-variable">$start_time</span></span><span>) . </span><span><span class="hljs-string">" seconds"</span></span><span>;
</span></span>
Étiquettes associées:
mysqli_stmt