2011-01-17 18 views
4

ループ内でsqlクエリを回避する必要があることをGoogleコードで示唆しています。その理由は、データベースへの複数のラウンドトリップがスクリプトを大幅に遅くするためです。それらが与える質問の例はこれです。ループ内のSQLクエリ

$userData = array(); 
foreach ($userList as $user) { 
    $userData[] = '("'.$user['first_name'].'", "'.$user['last_name'].'")'; 
} 
$query = 'INSERT INTO users (first_name,last_name) VALUES'.implode(',',$userData); 
mysql_query($query); 

私の質問は... 1.どのように重要なことは、ループの外にクエリを維持することであり、それは常に回避することがありますか? 2.この同じロジックを使用してSELECT文を実装するにはどうすればよいですか。

つまり、このクエリがあるとしましょう。

$index=0; 
while ($index < count($id)) { 
    $result[] = mysql_query("SELECT * FROM tblInfo WHERE site_id = '".$id[$index]."' "); 
    $index++; 
} 

どのようにこのSELECT文をループ外で実行できますか?私はこれよりはるかに複雑なSELECTステートメントを大量に持っています。したがって、必要と思われる場合は、これらのクエリをループから取り除きたいと思います。誰かがGoogleと同意している場合は、サンプルコードを投稿してください。

すべての応答を高く評価します。

+0

最初の例は意味をなさない。私はあなたの "スクリプト"が絶えず大量の挿入をしなければならないとは思っていません。一度の操作では、このようなループは重要ではありません。選択については、SQL –

+0

を学んでください.SQLは手続き型ではなく、SETベースです。 –

答えて

7

演算子IDのリストを使用して、MySQL IN演算子を使用できます。

SELECT * FROM table WHERE id IN (1,4,6,8,5,6) 

それは(千のSELECT Sより確かに良い)IDの数千人のさえ非常に長いリストを扱うことができます。しかし、このような場合は、アプリケーションの設計も考慮する必要があります。すべてのページの読み込み時に何千ものIDを持つINを使用する必要がある場合は、設計時に何かが間違っています。

INSERTを1つのクエリに集約することもできます(documentationを参照)。

一般に、ループ内のほとんどのクエリは、通常rewritten as subqueriesです。このような場合は、パフォーマンスと可読性/保守性のどちらかを選択する必要があります。サブクエリは、一般的に理解し、最適化/デバッグするのが大変です。あなたはこの記事が面白いかもしれません

+1

+1徹底して理解しやすいです。 – jaydel

1

往復コストを回避することはあなたにどのように重要なのは、いくつかのことに依存します。

まず、何回往復していますか?あなたが3または4を作っているなら、それを聞くことが苦痛になるならば、おそらくアドバイスを無視することができます。

第2に、セットアップでの往復の費用はどれくらいですか? dbへのラウンドトリップに100ミリ秒かかる場合は、2ミリ秒かかる場合よりもはるかに真剣に回避する必要があります。

第3に、クエリを実行する必要があるプロセスの時間はどれくらいですか?ユーザーが待っている場合は、これに注意を払う必要があります。ユーザーは待つのが嫌です!あなたが背後で実行され、いくつかの仕事をするAjaxプロセスを使用している場合は、それほど重要ではないかもしれません(タイムアウトのために注意する必要がありますが)。

Googleのアドバイスは基本的には無駄だが、無駄な時間は無駄だ。ただし、特定のケースに応じて、無駄な時間は、あなた、システム、およびユーザーに多かれ少なかれ深刻な可能性があります。

+0

今、私はデータベースに17回旅行します。この数字は、今後数年間でさらに多くの場所を開設しているため倍増します。それがかかる時間に関しては、私は確信していません。私はいくつかのテストを行い、どれくらいの時間がかかるかを見ます。私はまだ(まだ)AJAXを使用していませんが、確かに将来的には可能性があります。無駄な時間はそれほど重要ではありませんが、私は効率的なプログラミングを学ぼうと努力しているので、 "正しい"方法でやりたいと思います。 –

+0

しかし、どのくらいの頻度で、どれくらいの時間がかかりますか、どれくらいの時間があなたにとって問題になりますか?それらは本当に重要な質問です。それでも、あなたの人数が増えるにつれて、Googleの提案があなたにとってますます有益になる可能性があります。 –