gpt4 book ai didi

MYSQL:从一个用户组中选择用户并从另一个组中排除用户 - 优化

转载 作者:行者123 更新时间:2023-11-29 00:57:18 25 4
gpt4 key购买 nike

我这里有一个优化问题。

背景

我在用户表中有 12000 个用户,每个用户都有记录。每个用户可以在零个或多个组中。我有一个包含 45 个组的组表和一个包含 75000 条记录的 groups_link 表(以促进多对多关系)。

我正在制作一个查询屏幕,允许用户从用户列表中过滤用户。

目标

具体来说,我需要帮助:选择一个组中但不在另一个组中的所有用户。

数据库结构

enter image description here

查询

我当前的查询运行速度太慢...

 SELECT U.user_id,U.user_email
FROM (sc_module_users AS U)
JOIN sc_module_users_groups_links AS group_join ON group_join.user_id = U.user_id
LEFT JOIN sc_module_users_groups_links AS excluded_group_join ON group_join.user_id = U.user_id
WHERE group_join.group_id IN (27) AND excluded_group_join.group_id NOT IN (19) OR excluded_group_join.group_id IS NULL AND U.user_subscribed=1 AND U.user_active=1
GROUP BY U.user_id,U.user_id

此查询需要 9 分钟才能完成,它返回 11,000 条记录(总计 12,000 条)。

解释

下面是对该查询的解释: enter image description here Click here for a closer look

谁能帮助我将其优化到低于 1 分钟标记...?

经过3次修改,我改成了这个

    SELECT U.user_id,U.user_email FROM (sc_module_users AS U) WHERE ( user_country LIKE '%australia%' ) AND 
EXISTS (SELECT group_id FROM sc_module_users_groups_links l WHERE group_id in (31) AND l.user_id=U.user_id) AND
NOT EXISTS (SELECT group_id FROM sc_module_users_groups_links l WHERE group_id in (27) AND l.user_id=U.user_id)
AND U.user_subscribed=1 AND U.user_active=1 GROUP BY U.user_id

'mucccch 更快

最佳答案

编辑:删除了我的查询建议,但索引内容仍然适用:

可以通过仅在 user_idgroup_id 上创建复合索引来改进 sc_module_users_groups_links 上的索引。索引中列的顺序可能会产生影响 - 我相信首先使用 user_id 会表现得更好。

您也可以尝试删除 link_id 并只使用复合主键,因为 link_id 似乎没有任何其他用途。

关于MYSQL:从一个用户组中选择用户并从另一个组中排除用户 - 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5400618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com