2009-08-13 2 views
1

PHPとMySQLを使用クエリにOR演算子が多すぎる場合、mysqlクエリを最適化する方法はありますか?

FacebookのユーザーIDの配列を取得しました。

今、この配列のアプリケーションで、対応するユーザー名を探したいと思います。

明らかに私のアプリケーションでは、userテーブルに一意のユーザー名と一意のfb_uid値が含まれています。

1)ループを使用してfb_uidの配列を実行すると、ユーザー名を一つずつ見つける:プログラミングOOF

私の基本的な理解では、2つの方法に私を導きました。

OR

2)のようなモンスタークエリを作成fb_uid = VALUE1 OR fb_uid = value2のユーザーからの明確な(ユーザー名)を選択...

ので、うちより良い方法はありますか?

ありがとうございます。代わりに

答えて

1

fb_uidsのリストが大きい場合(たとえば、100の以上または500 R 1000年百IDS)、私は行かないだろう「または」の方法で:あまりにも多くの「または」これはDBを傷つけるでしょう、と私は思います。

しかし、IDごとに1つのクエリを実行すると、いずれかの本当に良いではありません...


それではこれら2つのアイデアのミックスはどうですか?たとえば、50または100のfb_uidsごとに1つのクエリを実行していますか?

そして、ロットまたはORを使用する代わりに、INを使用することもできます。このようなビット:

select distinct(username) from users where fb_uid IN (id1, id2, id3, ...) 

それは、少なくとも、DBのために何も変更はなく、よわからないが、より良い探している^^

だけの事はあなたがあまりにも多くのIDを使用するべきではないですIN;そのため、毎回50〜500のIDを使用して、いくつかのクエリを実行することができます。


とビットさらにあなたを助けるために、あなたはfb_uids配列の「スライス」を抽出するために、array_sliceを見てみる必要があるかもしれません...

+0

http://dev.mysql.com/doc/refman/5.0/en/comparison-operators。html#function_in - このリンクによると、MySQLのINの最大値はmax_packet_sizeによってのみ制限されます。だから、あなたがそこにどれくらいの価値を置いているのかは、おそらくかなり大きいかもしれませんが、_how_ largeを見つけるためにテストが必要になるかもしれません。それ以外は、私はあなたの答えが好きです:+1。 – nilamo

+0

私はそれがパフォーマンスにある程度の影響を与えることができると考えていました - それは実際にIN()内にあまりにも多くの値を入れないと思った理由です。しかし、私はそれについてMySQL上のベンチマークをしなかったことを認めなければなりません^^ –

0

他のMySQL機能があります:

SELECT * FROM customer WHERE status = 1 AND MATCH (person, city, company, zipcode, tags) AGAINST ('".$searchstring."' IN BOOLEAN MODE) 

あなたの入力文字列は、別の列で検索されます。

この機能がわからない場合は、SQL文を再検討することもできます。

関連する問題