mysql - 复杂SQL查询性能问题(group by、case语句)

标签 mysql sql

sql 查询(在帖子末尾)存在严重的性能问题。在小数据集上最多需要 1 秒。我对 SQL 还很陌生。谁能给我一些关于如何优化查询的建议?我有两个表,用户表和通知表。

用户表:

user_id, first_name, profile_image

通知表:

category, to_uid, from_id, title_id, create_time (linux timestamp)

我想通过类别和 title_id 字段的组合返回指定 to_uid 组的聚合通知。有一个类别称为“特殊”。如果该类别被称为“特殊”,那么我们不应该聚合该行。如果行的类别是“特殊”,则其 from_id 和 title_id 字段始终为 NULL。

通知示例数据:

category, to_uid,   from_id, title_id, create_time (linux timestamp)
like_post, 4,          3,       5,       123456
follow,    4,          3,       4,       123457
like_post, 4,          5,       5,       123478
special,   4,          NULL,    NULL,    123467 
special,   4,          NULL,    NULL,    123468 

预期结果:

category,  to_uid,  from_id,   title_id,     first_name_list
like_post,   4,        3,5          5,         uid_3_first_name,uid_5_first_name 
follow,      4,        3,           4,         uid_3_first_name
special,     4,        NULL,        NULL,      NULL
special,     4,        NULL,        NULL,      123468 
<小时/>
SELECT n.category, n.to_uid, n.title_id, n.title, n.create_time, 
    CASE WHEN n.category <> "category1"
        THEN GROUP_CONCAT(u.first_name)
    END user_name_list,
    GROUP_CONCAT(n.from_id) from_id_list, GROUP_CONCAT(u.profile_image) profile_image_list,
    CASE WHEN n.category IN ("category2")
            THEN concat_ws("_", n.title_id, n.category)
         ELSE concat_ws("_", "uni", n.id, n.category)
    END AS group_id
FROM notification n, user u
WHERE CASE WHEN n.category <> "category1"
            THEN n.from_id = u.user_id
           ELSE 1 = 1
      END
AND to_uid = 20
GROUP BY group_id
ORDER BY n.create_time DESC
LIMIT 20;

最佳答案

尝试使用 LEFT JOIN 代替

FROM notification n LEFT JOIN user u 
   ON n.category <> "category1" AND n.from_id = u.user_id
WHERE
to_uid = 20

关于mysql - 复杂SQL查询性能问题(group by、case语句),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23003600/

相关文章:

mysql - 通过关系连接用 mysql 返回匹配两个值的行的方法

php - 用于从单个数据库中的多个表中进行选择的 SQL 查询

mysql - SQL检查A和B是否IN(...)

MySQL 查询优化 - 现有查询运行速度太慢

php - 修改 CONCAT 显示

sql - 帮助从 MySQL 查询获取或显示 ColdFusion 中的随机记录?

c# - LiNQ 在 OrderBy 之后使用 ThenBy

mysql - SQL:如何透视列中的维度?

用于创建服务器别名的 SQL Server 命令?

mysql - 是否可以限制扫描文档的数量,类似于MySQL subselect?