如何在MYSQL语句中最有效地获取这些group_by统计信息

时间:2017-04-02 02:14:03

标签: mysql sql database mariadb

假设我有一个像这样创建的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。此文件中的条目太长,无法包含在SQL语句的单个where子句中。

我想回答以下问题:

  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个计数的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

使用left join和条件聚合来获得所需的计数。

select 
 sum(l.id is not null and t.my_boolean_field is null)
,sum(l.id is not null and t.my_boolean_field =1)
,sum(l.id is not null and t.my_boolean_field =0)
,sum(l.id is null and t.my_boolean_field is null)
,sum(l.id is null and t.my_boolean_field =1)
,sum(l.id is null and t.my_boolean_field =0)
from my_table t
left join my_list l on l.id=t.my_id

sum中的条件被视为布尔值,返回1表示真,0表示假。

答案 1 :(得分:0)

CREATE TABLE list (
    `my_id` char(32) NOT NULL
);

LOAD DATA INFILE ... -- get the 500 rows into `list`.

SELECT 
    SUM(my_boolean_field IS NULL),
    SUM(my_boolean_field = 0),
    SUM(my_boolean_field = 1),
    SUM(my_boolean_field IS NOT NULL),
    SUM(my_boolean_field != 0),
    SUM(my_boolean_field != 1)
FROM tbl  AS t
JOIN list AS l ON t.my_id = l.my_id;

它会进行500次查找,计算6个计数器。