2016-08-05 12 views
1

サンプルテーブル「salary_details」SQLクエリの最適化(時間)

enter image description hereを考慮してください。

いくつかの前処理の後、私はいくつかのIDをArrayList( 'user_id')に持っています。私がやりたい何か、

user_id(0): 1 
user_id(1): 3 
user_id(2): 4 
user_id(3): 6 

は給与= 2000

が優れているアプローチのみのidのフィルタである:

1. 

    for (int i = 0; i < user_id.size(); i++) { 
    SELECT ID FROM salary_details WHERE (part_id = user_id.get(i)) AND (SALARY = 2000) 
    } 

または

2. 

SELECT ID FROM salary_details 
    WHERE ((part_id = user_id.get(0)) 
    OR (part_id = user_id.get(1)) 
    OR (part_id = user_id.get(2)) 
    OR (part_id = user_id.get(3))) 
    AND (SALARY = 2000) 

あるいは、他にも良い選択肢がありますか?

+1

具体的に作られた 'IN'演算子があります。 –

+0

はい、これもオプションです。私が疑問に思ったのは、ループ内のパラメータをより良いオプションに渡すかどうかです。前処理の後、私はarraylistでより多くのIDで終わるでしょうか? – Betafish

+0

この構文は何ですか: 'user_id.get(2)'? –

答えて

2

IN句を使用します。

SELECT ID FROM salary_details WHERE SALARY = 2000 and part_id (in user_ids) 

正確な構文は、あなたのドライバ/言語(ただ一つのこと:あなたのクエリを構築するために、SQLと値を連結していない、プリペアドステートメントを使用します)に依存します。今、最も効率的なクエリ

  • が測定
  • によって発見されなければならない

    は、データとインデックスの非常に依存している(explainを使用)

+0

構文: 'part_id IN(1,2,3)'。最適インデックス: 'INDEX(salary、part_id、id)'。 –

2

これらのクエリのどちらも、それに実行されますです現在のフォーム!

大まかには、不必要に多数のクエリでデータベースにヒットすることを避けます。その基準に基づいて、各IDから1つ1つずつループしたりクエリしたりすることは大きなノーではない

2番目のクエリは非常に優れていますが、それでもたくさんある場合は構築するのが大きな仕事になりますあなたの配列内の要素。

最良の方法は、IN句を使用することです。これは単純なクエリーであり、作成が非常に簡単で、クエリープランナーがデータベースを一度だけ解析してヒットするのは簡単です。

と言えば、それが疑わしいベンチマークであるときに!