假设我有一个像这样创建的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
只有可能的值为1
,0
和null
。
现在另外,我有一个500个ID的列表。我们称之为my_list
。它们位于由换行符分隔的文本文件中。该文件的名称为myfile.txt
。
我想回答以下问题:
my_table
中有多少行,my_list
和my_boolean_field中的ID为空。my_table
中有多少行以及my_list
和my_boolean_field == 1中的ID。my_table
中有多少行以及my_list
和my_boolean_field == 0中的ID。my_table
中有多少行,my_list
和my_boolean_field中的ID为空。my_table
中有多少行和my_list
以及my_boolean_field == 1中的ID。my_table
中有多少行和my_list
以及my_boolean_field == 0中的ID。获得上述6个计数的最佳方法是什么?
答案 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
的搜索(它使用二进制搜索)。所以这可能是最快的方法。