【问题标题】:SQL: Return immediately if one matched record foundSQL:如果找到一条匹配的记录,则立即返回
【发布时间】:2021-02-02 09:38:16
【问题描述】:

我有一张桌子,里面有用户和他们的帖子。它看起来像“user_id | post_id | post_status”。

现在我有一个用户 ID 列表(例如,100 个用户),我想知道其中有多少人至少有一个帖子被删除(例如,post_status 3)。

这是我的示例搜索:

select count(distinct user_id) 
from post_table 
where user_id in ( {my set} ) 
  and post_status=3

它运行得非常慢,因为它会迭代整个表。有没有办法加快查询速度?

【问题讨论】:

  • 标题和问题的意图似乎略有不同

标签: mysql query-optimization


【解决方案1】:

使用类似的东西

SELECT COUNT(*)
FROM
-- the list of userid as a rowset
     ( SELECT 123 AS user_id UNION ALL
       SELECT 456            UNION ALL
       -- ...
       SELECT 789
       ) user_id_list
WHERE EXISTS ( SELECT NULL
               FROM post_table 
               WHERE post_table.user_id = user_id_list.user_id
                 AND post_table.post_status = 3 )

如果您的 MySQL 版本是 8.0.4 或更高版本,那么您可以将用户列表提供为 CSV/JSON 并使用 JSON_TABLE 对其进行解析(查询文本会更紧凑)。

【讨论】:

    【解决方案2】:
    INDEX(post_status, user_id)
    

    可能有助于加快查询速度,尤其是在很少有行的状态=3 时。

    这也可以加快 Akina 的解决方案。

    【讨论】:

      猜你喜欢
      • 2021-04-04
      • 1970-01-01
      • 2015-04-30
      • 2022-01-11
      • 2014-06-17
      • 2011-12-27
      • 1970-01-01
      • 2014-05-21
      • 2021-11-24
      相关资源
      最近更新 更多