假设我有一个像这样创建的 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;
这张 table 很大。它大约有 1000 万行。 my_boolean_field
唯一可能的值为 1
、0
和 null
。
现在,我有一个包含 500 个 ID 的列表。我们称之为 my_list
。它们位于由换行符分隔的文本文件中。该文件的名称是 myfile.txt
。
我想回答以下问题:
my_table
中有多少行具有my_list
中的 ID,且 my_boolean_field 为空。my_table
中有多少行具有my_list
中的 ID 以及 my_boolean_field==1。my_table
中有多少行具有my_list
中的 ID 且 my_boolean_field==0。my_table
中有多少行的 ID 不在my_list
中且 my_boolean_field 为 null。my_table
中有多少行的 ID 不在my_list
和 my_boolean_field==1 中。my_table
中有多少行的 ID 不在my_list
中且 my_boolean_field==0。
获得上述 6 个计数的最高效方法是什么?
最佳答案
您必须进行全表扫描,因此这可能是最好的解决方案:
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;
如果您的列表位于带有索引的表中,则可以对其使用左连接
。然而,MySQL 优化了对具有常量值的 in
的搜索(它使用二分搜索)。所以这可能是最快的方法。
关于mysql - 如何以最高效的方式查询这个MySQL表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43162609/