(mysqlndを使用して)任意の複数ステートメントSQLをMysqliに渡し、結果セットを取得します。 SELECTステートメントにはLIMIT
節を含めることができます。私が必要とするのは、フェッチされた行を1000(ハードコードされた制限)に制限することです。それは私が持っているものです。Mysqli:use_resultの後の行をスキップ
define('SAFE_ROWS', 1000); // strict limit
$sql = "SELECT * FROM table1 LIMIT 99999999";
$mysqli->multi_query($sql);
// unbuffered: results are stored at MySQL-side
// and transfer when i call fetch*
$result = $mysqli->use_result();
$rows = [];
while ($row = $result->fetch_array()) {
if (count($rows) >= SAFE_ROWS) {
#############################################
# QUESTION: what i have to do here #
# to skip remaining rows of current result? #
#############################################
break;
}
$rows[] = $row;
}
// As slow as much rows remained unfetched:
$result->free();
解放結果が取り出されなかった行の多くは、現在の結果の中にあった場合は時間がかかりすぎます。 MySQLに "私はこの結果の残りの行をもう必要としないで、埋めるだけです"と伝える方法はありますか?
PS。私はSQL_SELECT_LIMIT
オプションについて知っていますが、select limitが明らかに設定されている場合(SELECT * FROM t1 LIMIT 99999999
)、この制限は無視されます。
あなたは実際にコードをベンチマークして、 'free'が問題であると判断しましたか?また、繰り返しごとに配列を数えるのではなく、ループで増加するカウンタ変数を持つことも意味があります。 – KillerX
@YourCommonSense私は特にこの質問に答える(またはむしろコメントする)より適切なユーザー名を見たことがありません。 – Andrew
質問を表すためにコードを簡略化しました。私は実際にいくつかの選択/挿入/更新ステートメントを含むかもしれない別のSQLを実行します。また、私は各反復の要素を数えません。もちろん、単純なコードを表示したいだけです。 @KillerX、はい、各コードブロックの評価時間を確認しました。 – Bars