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

标签 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;

这张 table 很大。它大约有 1000 万行。 my_boolean_field 唯一可能的值为 10null

现在,我有一个包含 500 个 ID 的列表。我们称之为 my_list。它们位于由换行符分隔的文本文件中。该文件的名称是 myfile.txt

我想回答以下问题:

  1. my_table 中有多少行具有 my_list 中的 ID,且 my_boolean_field 为空。
  2. my_table 中有多少行具有 my_list 中的 ID 以及 my_boolean_field==1。
  3. my_table 中有多少行具有 my_list 中的 ID 且 my_boolean_field==0。
  4. my_table 中有多少行的 ID 不在 my_list 中且 my_boolean_field 为 null。
  5. my_table 中有多少行的 ID 不在 my_list 和 my_boolean_field==1 中。
  6. 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/

相关文章:

mysql - 带 GROUP BY 和条件的 SQL 查询

sql - libpq 如何传递批量数据

database - 从 XCode 连接到 Microsoft Access 数据库

mysql - MySQL与docker访问被拒绝

php - 是否可以在 mysql 查询中使用 $variable 而不是 'row.table'?

mysql - 根据外键表中的键对表进行排序

php - 索引唯一键似乎不起作用

mysql - MySQL 中的订单日期格式为 "01 August 2013"

sql-server - 数据库设计 - 最佳实践 - 一个用于 Web 表单下拉选项的表格或用于每个下拉选项的单独表格

PHP 和 MySQLi 检查是否在事务中