2017-04-01 10 views
0

は、私がこのように作成されたMySQLのテーブルがあるとします。このMySQLテーブルを最も効果的な方法でクエリするには?

CREATE TABLE `my_table` (
    `my_id` char(32) NOT NULL, 
    `my_boolean_field` tinyint(1) DEFAULT NULL, 
    PRIMARY KEY (`my_id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

このテーブルは非常に大きいです。それには約1,000万行があります。 my_boolean_fieldの値は1,0nullです。

今は別に、私は500のIDのリストを持っています。これをmy_listとしましょう。それらは、改行で区切られたテキストファイル内にあります。そのファイルの名前はmyfile.txtです。

私は次の質問に答えたい:

  1. どのように多くのmy_tableの行があり、my_listにあり、my_boolean_fieldがnullのID。
  2. my_tableの行数とIDはmy_listで、my_boolean_field == 1です。
  3. my_tableの行数とmy_listとmy_boolean_field == 0にあるID。
  4. my_tableの行数とmy_listにないIDがあり、my_boolean_fieldがnullです。
  5. my_tableの行数とmy_listおよびmy_boolean_field == 1にないIDがあります。
  6. my_tableの行数とmy_listおよびmy_boolean_field == 0にないIDがあります。

上記の6つのカウントを得る最も効果的な方法は何ですか?

答えて

0

あなたは、全表スキャンを行う必要がありますので、これはおそらく最良の解決策です:

select (case when id in (< your list >) then 'in' else 'out' end) as inlist, 
     my_boolean_field, count(*) 
from mytable t 
group by (case when id in (< your list >) then 'in' else out' end), 
     my_boolean_field; 

あなたのリストは、インデックスを持つテーブルにある場合、あなたはそれにleft joinを使用することができます。しかし、MySQLはinの検索を一定値(バイナリ検索を使用)で最適化します。したがって、これは最も速い方法である可能性が高いです。

+0

オリジナルの質問に私の編集を見ることができますか? 500個のIDのリストはテキストファイルにあります。単一のSQLステートメントに収めるには時間がかかりすぎます。 –

+1

@ SaqibAli。 。 。 500個のIDからクエリを作成できます。あるいは、 'id'の主キーを使ってテーブルにロードすることもできます。 –

関連する問題