Aktueller Standort: Startseite> Neueste Artikel> Wie verwende ich effizient mySQLI_STMT :: store_result in Multi-Result-Set-Abfrage?

Wie verwende ich effizient mySQLI_STMT :: store_result in Multi-Result-Set-Abfrage?

gitbox 2025-09-15

Was ist eine Multi-Re-sult-Set-Abfrage?

Die Multi-Result-Set-Abfrage bezieht sich auf die Situation, in der eine einzelne SQL-Abfrage mehrere Ergebnissätze zurückgibt. Typischerweise wird diese Abfrage durch ( Semi-Kolon) durchgeführt, die mehrere SQL-Anweisungen trennen. Zum Beispiel:

 <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>

Die obige Abfrage gibt zwei Ergebnissätze zurück. Für MySQL kann die Multi-Re-Result-Set-Abfrage über die Funktion von MySQLI_Multi_query () durchgeführt werden und zum nächsten Ergebnis wechseln, der über mySQLI_NEXT_RESULT () eingestellt wurde.

Die Rolle von MySQLI_STMT :: Store_Result ()

In der MySQLI -Erweiterung ist MySQLI_STMT :: Store_Result () eine Funktion, mit der Abfragenergebnisse vom Server zum Client gelagert werden. Dies bedeutet, dass die Daten aus dem Abfrageergebnissatz vollständig vom Datenbankserver in den Speicher des Clients geladen werden. Für Szenarien, in denen Daten mehrfach zugegriffen werden, kann Store_Result () die Leistung verbessern, da die Interaktion mit dem Datenbankserver bei jedem Lesen der Daten vermeidet wird.

Herausforderungen in der Multi-Re-Lesult-Set-Abfrage

Bei der Durchführung von Abfragen mit mehreren Result-Set-Set gibt jedes Ergebnis die Daten unabhängig voneinander zurück. Wenn Sie fälschlicherweise store_result () verwenden, können die folgenden Probleme verursacht werden:

  1. Hochspeicher -Fußabdruck : Wenn das Abfrageergebnissatz sehr groß ist, lädt es Store_Result () in den Speicher, was zu übermäßigem Speicher -Fußabdruck führt.

  2. Das Ergebnissatz wird nicht vollständig gelesen : In einer Multi-Re-Result-Set-Abfrage, wenn mySQLI_NEXT_RESULT () und STORE_RESULT () nicht ordnungsgemäß genannt werden, werden einige Ergebnissätze möglicherweise nicht vollständig gelesen, was zu Fehlern in nachfolgenden Abfragen führt.

  3. Ausführungseffizienzproblem : Da für jede Abfrage ein vollständiger Datensatz aus der Datenbank geladen werden muss, bringt eine übermäßige Verwendung von Store_Result () die Leistungsbelastung.

Verwenden Sie effizient mySQLi_stmt :: store_result () Methode

1. verwenden

Zunächst muss die Funktion von MySQLI_Multi_query () verwendet werden, um Multi-Re-Result-Set-Abfragen auszuführen. Mit dieser Funktion können wir mehrere SQL -Anweisungen ausführen und mehrere Ergebnissätze zurückgeben. Bei der Verwendung sollte ein Schlüsselpunkt beachtet werden: MySQLI_Multi_query () gibt alle Abfrageergebnisse zurück, verarbeitet jedoch nicht automatisch den Ergebnissatz. Sie müssen jedes Ergebnis manuell durch mySQLI_NEXT_RESULT () durchlaufen.

 <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>-&gt;</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">// Holen Sie sich das aktuelle Ergebnissatz</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>-&gt;</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>-&gt;</span><span><span class="hljs-title function_ invoke__">fetch_assoc</span></span><span>()) {
                </span><span><span class="hljs-comment">// Verarbeiten Sie jede Datenreihe</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>-&gt;</span><span><span class="hljs-title function_ invoke__">free</span></span><span>();  </span><span><span class="hljs-comment">// Geben Sie die aktuelle Ergebnismenge frei</span></span><span>
        }
    } </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">next_result</span></span><span>());  </span><span><span class="hljs-comment">// Holen Sie sich das nächste Ergebnissatz</span></span><span>
}

</span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span></span>

2. Achten Sie auf die Speicherverwaltung, wenn Sie Store_Result () verwenden)

Da Store_Result () das gesamte Abfrageergebnis in den Speicher lädt, kann es bei der Verarbeitung großer Datenmengen nicht genügend Speicher geben. Um den Speicher effizient zu verwalten, wird empfohlen, $ $ result-> Free () zu verwenden, um den Speicherplatz nach der Verarbeitung jedes Ergebnissatzes freizugeben.

3. Verwenden Sie Store_Result () nur bei Bedarf

Nicht alle Abfragen erfordern die Verwendung von Store_Result () , insbesondere wenn nur die Abfragergebnisse sofort gelesen werden müssen. Wenn Sie für einfache Auswahlabfragen nur einen Teil der Daten erhalten und die Abfrageergebnisse gering sind, können Sie in Betracht ziehen , Bind_result () oder Fetch () direkt zu verwenden, um die Daten zu erhalten, anstatt Store_Result () zu verwenden. Dies reduziert den Speicherkonsum.

 <span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</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>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</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>-&gt;</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>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span></span>

4. Verwenden Sie Pagination -Abfrage, um die Ergebnisse der Ergebnismenge zu verringern

Wenn ein Ergebnissatz sehr groß ist, sollten Sie die Abfrage in mehrere Paging -Abfragen aufteilen. Durch die Begrenzung der Anzahl der zurückgegebenen Datensätze pro Abfrage wird die Menge der in einem einzigen Zeit geladenen Daten reduziert, wodurch die Effizienz erhöht und die Speicherverwendung verringert wird.

 <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>-&gt;</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>-&gt;</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>

5. Überwachen Sie die Ausführungszeit der Abfrage

Um den effizienten Einsatz von Store_Result () in Multi-Reult-Set-Abfragen zu gewährleisten, können Sie dem Code die Ausführungszeitüberwachung hinzufügen, um festzustellen, ob eine Abfrage Leistungs Engpässe verursacht hat. Wenn die Abfrage zu langsam ist, können Sie in Betracht ziehen, SQL -Anweisungen zu optimieren oder Schritt für Schritt auszuführen.

 <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">// Eine Frage ausführen</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>