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/