2017-04-01 71 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; 

此表是非常大的。它有大約1000萬行。 my_boolean_field唯一可能的值是10null

現在分開,我有一個500個ID的列表。我們稱之爲my_list。它們位於由換行符分隔的文本文件中。該文件的名稱是myfile.txt

我要回答以下問題:

  1. 多少在my_table行已經和ID是在my_list和my_boolean_field爲空。
  2. my_table中有多少行的ID爲my_list,my_boolean_field == 1。
  3. my_table中有多少行的ID爲my_list,my_boolean_field == 0。
  4. my_table中的行數有多少,並且ID不在my_list且my_boolean_field爲空。
  5. my_table中的行數有多少,並且ID不在my_list和my_boolean_field == 1中。
  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'上的主鍵將它們加載到表中。 –