2017-10-25 8 views
1

これを最もよく記述する方法がわからないので、私と一緒に裸にしてください。 4つの列を持つ表があるとします:id (int 11, indexed), title, content, category (varchar 5)大きなWHERE IN()節を持つMySQLのパフォーマンス

カテゴリを選択しました。各カテゴリには最大999のオブジェクトを含めることができます。 SELECT id FROM table WHERE category = ?を使用して、私はすべてのオブジェクトのリストを取得します。

次に、ユーザーにオブジェクトの一部を選択/選択解除させます。その後、残りの選択されたオブジェクトの内容を選択する必要があります。

私の質問は以下の通りです。SELECT content FROM table WHERE id IN($array)を使用するとパフォーマンスが心配するべきですか? SELECT content FROM table WHERE category = ? AND id IN($array)を使用する方が良いでしょうか。ここでのアイデアは、INを実行する前に999個のオブジェクトに絞り込みます。

これは意味がありますか?または、IN()をまったく使用しないでください。

+0

私はあまりパフォーマンスを心配しないだろうパフォーマンスが高すぎます。 –

+0

MySQLのEXPLAIN構文を読み、それを使って2つのクエリの違いを理解してください –

+0

'category'にはインデックスを付けるべきです – nogad

答えて

0

画面には常にcontentが表示されていますか?

999は、長いのリストです。あなたのUIを再考してください。

選択/選択解除すると、どうなりますか? contentを灰色化しますか?もしそうなら、これはUIの問題であり、データベースの問題ではありません。現在選択されているサブセットを保存すると、格納されているのはどこですか?そして、選択/選択解除のたびに保存しますか?または、「送信」をクリックするまで待ちますか?

つまり、これがデータベースの質問である理由はわかりません。

戻る問題のクエリへ:あなたは数万行を持っているし、その後も、適切なインデックスと、あなたが心配する必要はありませんまで

INDEX(category) 
SELECT ... FROM tbl WHERE category = ...; -- This is optimal 

PRIMARY KEY(id) 
SELECT ... FROM tbl WHERE id IN (...); -- optimal for an arbitrary set 

INDEX(category, id) 
SELECT ... FROM tbl WHERE category = ... AND id IN (...) 
    -- use this only if you both parts are needed for filtering 
    -- not for optimizing 
+0

Rickのおかげで本当にありがとうございました。そして、私は999のアイテムがたくさんあることを知っていますが、それは最大です。実際には、カテゴリごとに50〜100行が必要です。各行には、約20セルの小数点(6,2)またはvarchar(10)があります。行はテーブルに表示され、値は編集できます(行ごとまたはすべての行がバッチで表示されるため、すべて表示する必要があります)。編集後、テンプレートを使って行ごとにテキストファイルが作成されます...私はphp/sqlが私がしようとしていることを達成するために最良の選択肢から遠いことを認識していますが、それは私が知っている言語です。ええ^ _ ^ –

関連する問題