データベース操作にPHPとMySQLを使用する場合、多くの開発者が問題に遭遇した可能性があります。複数のSQLステートメントを実行すると、mysqli :: next_result()が必要です。今日は、あなたが真実を理解するのを助けるために、この問題の内と外を探求します。
mysqli_multi_query()を使用して複数のSQLステートメントを実行する場合、各ステートメントの結果を手動で処理する必要があります。この時点で、 next_result()の関数は、内部ポインターを次のSQLステートメントの結果セットに移動することです。
$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()は基本的にクエリを実行しているわけではありませんが、MySQLIクライアントに「サーバーから次の結果を取得できる」と伝えます。その主な時間消費は次のとおりです。
ネットワークレイテンシ(クライアントサーバー通信)
大きなデータボリューム(結果セットが大きいとメモリは消費されます)
非必須処理(未処理の結果もクリーニングする必要があります)
したがって、クエリ自体がすでに速い場合、 next_result()への呼び出しはほとんど無視できます。しかし、クエリが大量のデータを生成する場合、結果セットの各移動は、以前の結果を解析してリリースする必要があることを意味し、実際に追加のオーバーヘッドが発生する可能性があります。
テストで以下のマルチクエリステートメントを実行するとします。
$sql = "
SELECT * FROM big_table_1;
SELECT * FROM big_table_2;
SELECT * FROM big_table_3;
";
各テーブルのデータボリュームは約50,000行です。
2セットのテストを実行します。
A: multi_query() + next_result()を使用して、各結果を正常に解析します。
B: Multi_Query()を使用しますが、最初の結果のみが実行され、残りは無視されます。
統計は次のとおりです(秒単位):
モデル | 実行時間 |
---|---|
a | 0.82s |
b | 0.48s |
ご覧のとおり、後続の結果セットが必要ない場合、 next_result()を実際に呼び出さないと、より速くなります。しかし、このデータを取得する必要がある限り、それは不可欠です。
1つのステートメントのクエリ結果のみが必要な場合は、 Multi_Query()の使用を避けてください。
// より推奨される方法
$result = $conn->query("SELECT * FROM users");
Multi_Query()を使用する場合、各クエリステートメントによって返されるデータの量を可能な限り制御します。たとえば、必要なフィールドのみを選択するか、制限を使用して番号を制限します。
SELECT id, name FROM users LIMIT 100;
特にループで使用する場合は、メモリの蓄積を防ぐために、 store_result()の後に$ result-> free()を呼び出してください。
next_result()自体は「クエリを遅くする」ことはなく、プロセスの一部にすぎません。
速度に本当に影響するのは、データの量と、すべての結果が本当に必要かどうかです。
クエリが1つしか必要ない場合は、 Multi_Query()を避けてください。
複数の結果処理が必要な場合は、 next_result()が優れたヘルパーです。
詳細なパフォーマンス分析については、 https://gitbox.net/articles/db-performanceの詳細な比較レポートをご覧ください。