如何以最高效的方式查询这个MySQL表?

时间:2017-04-01 22:19:09

标签: mysql sql database

假设我有一个像这样创建的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中有多少行,my_list和my_boolean_field中的ID为空。
  2. my_table中有多少行以及my_list和my_boolean_field == 1中的ID。
  3. my_table中有多少行以及my_list和my_boolean_field == 0中的ID。
  4. my_table中有多少行,my_list和my_boolean_field中的ID为空。
  5. my_table中有多少行和my_list以及my_boolean_field == 1中的ID。
  6. my_table中有多少行和my_list以及my_boolean_field == 0中的ID。
  7. 获得上述6个计数的最佳方法是什么?

1 个答案:

答案 0 :(得分: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的搜索(它使用二进制搜索)。所以这可能是最快的方法。