2017-11-10 10 views
-1

(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)、この制限は無視されます。

+0

あなたは実際にコードをベンチマークして、 'free'が問題であると判断しましたか?また、繰り返しごとに配列を数えるのではなく、ループで増加するカウンタ変数を持つことも意味があります。 – KillerX

+1

@YourCommonSense私は特にこの質問に答える(またはむしろコメントする)より適切なユーザー名を見たことがありません。 – Andrew

+0

質問を表すためにコードを簡略化しました。私は実際にいくつかの選択/挿入/更新ステートメントを含むかもしれない別のSQLを実行します。また、私は各反復の要素を数えません。もちろん、単純なコードを表示したいだけです。 @KillerX、はい、各コードブロックの評価時間を確認しました。 – Bars

答えて

5

あなたがやっていることは野蛮と呼ばれています。
クエリ結果を破棄することは問題ではありません。私はキャンプファイヤーを必要

自分自身にお茶を沸かすために:素人の用語では

は、あなたの質問にはたくさんのようなものです。いくつかのトランクを切り落とすことはあまりにも多くの作業です。私は1トンのダイナマイトを持っていましたので、私は森全体を爆破しました。これは大丈夫だった、私のキャンプファイヤーは完璧だった。しかし、今私はそのゴミをすべて捨てる必要はありません。私はそれを煙のパフで消えさせることができますか?

ここでの主な問題は、もはや森ではありません。

あなたのアイデアはまったく同じです。あなたはPHPとMySQLの両方の面でたくさんのリソースを無駄にしています。これにより、MySQLサーバーには大量のデータをロードさせることができます。そして結果セットをクリアするのにかかる時間でさえ、あなたが何か間違っていることをあなたに暗示しません。

すべての場合、数ギガバイトのデータを1秒で破棄するという魔法の方法があります。しかし、これらのギガバイトを最初に集める必要があります。自力で作ったphpmyadminがデータベースサーバを殺すと、そのユーザはあなたが期待したほどの感謝はしません。

あなたが「別のphpmyadminを使って作業している」とコメントしました。したがって、phpmyadminが行うことを実行してください.SQLを解析し、LIMITの部分をクエリに追加してください。

+0

私はすでに自分で宣言しないと、テーブルからすべての行を選択できないようにSQL_SELECT_LIMITを使っています。私はmysql(use_result)から転送された結果全体を取得するのではなく、行単位でフェッチします(また、PHP側の行数を制御します)。だから、PHPはあまりにも多くのメモリを使用しません(バッファされていないクエリを使用して)。私が必要とするのは、ユーザーがあまりにも大きな制限を設定すると、メモリの割り当てを高速化することだけです。余分な行はMysqlに格納されていますが、それは事実ですが、私は理解していますが、PHPに転送することはできません。あなたの新しい答えはとても面白いです。あなたの以前の「いいえ」はずっと役に立ちました。 – Bars

関連する問題