0

別のPHPスクリプトが挿入...選択...クエリを実行しているときに、PHPスクリプトで単純なcount(*)クエリを実行することは可能ですか?

別のテーブルから最大100万行以上のテーブルを作成する必要があり、挿入中にページがフリーズしているとユーザーに感じさせたくないので、カウントを更新し続けようとしていますが、select count(\*) from table挿入のバックグラウンドで、挿入が完了するまで0しか得られませんでした。

では、MySQLが最初に部分的な結果を返すように依頼する方法はありますか?または、挿入...選択...クエリとほぼ同じパフォーマンスで、前の選択クエリからフェッチされたデータを使用して一連の挿入を実行する高速な方法はありますか?

環境はphp4.3とMySQL4.1です。

4

6 に答える 6

3

パフォーマンスを低下させずに?ありそうもない。少しパフォーマンスが低下すると、おそらく...

しかし、定期的にテーブルを作成し、何百万もの行を挿入しているのはなぜでしょうか? これをめったに行わない場合は、管理者 (おそらくそのようなことを許可されている唯一の人) に、これには長い時間がかかることを警告できませんか? もしあなたがこれをいつもしているなら、あなたはそれが間違っていないと本当に確信していますか?

于 2008-12-01T17:58:33.060 に答える
2

PHP リクエスト中に一度に 100 万行をコピーする場合、これは危険信号であるという Stein のコメントに同意します。

私は、人々が SQL をマイクロ最適化しようとしているほとんどの場合、別の方法で問題にアプローチすることで、はるかに優れたパフォーマンスとスループットを得ることができると信じています。SQL がボトルネックになるべきではありません。

于 2008-12-01T18:06:29.190 に答える
0

他のユーザーは、コミットされるまで挿入を確認できません。半分完了したデータを表示できないようにするため、通常はこれは良いことです。ただし、中間データを表示したい場合は、挿入中に「コミット」するための呼び出しをときどきスローすることができます。

ちなみに、自動コミットをオンにするように誰にも言わせないでください。それは膨大な時間の浪費です。データベースに「削除と再挿入」ジョブがあり、自動コミットをオフにすると3分の1の時間がかかります。

于 2008-12-01T17:55:58.290 に答える
0

明確にするために、MySQL 4 はデフォルトではトランザクションを使用するように構成されていません。私の記憶が正しければ、挿入ごとにテーブル全体をロックする MyISAM テーブルタイプを使用します。

LOAD DATA INFILEなどの MySQL 一括挿入関数の 1 つを使用することをお勧めします。これは、大量のデータを挿入する際に劇的に高速になるためです。カウントに関しては、挿入を 1000 (または Y) の N グループに分割し、進行状況メーターを N セクションに分割し、各グループの要求に応じて更新することができます。

編集:考慮すべきもう 1 つのことは、これがテンプレートの静的データである場合、「select into」を使用して同じデータで新しいテーブルを作成できることです。アプリケーションが何であるか、または意図された機能が不明ですが、それも同様に機能する可能性があります。

于 2008-12-01T18:01:05.627 に答える
0

単一の INSERT...SELECT を実行している場合、いいえ、中間結果を取得することはできません。実際、ステートメントまたはトランザクションの部分的な結果のみを示す中間状態のデータベースをユーザーが見ることは決してないため、これは悪いことです。詳細については、ACIDコンプライアンスを参照してください。

とはいえ、MyISAM エンジンはこれで高速かつ緩い動作をする可能性があります。MyISAM が INSERT...SELECT の一部の行を途中で中止したときに、すべてではなく一部の行をコミットするのを見たことがあると確信しています。ただし、テーブルが使用しているエンジンについては言及していません。

于 2008-12-01T18:01:26.097 に答える
0

コンソールにアクセスできる場合は、探している情報を提供するさまざまなステータスの質問をすることができます。「SHOW processlist」のようなコマンドがあります。

于 2008-12-01T18:07:59.700 に答える