gpt4 book ai didi

php - 洞察查询优化

转载 作者:太空宇宙 更新时间:2023-11-03 11:20:53 28 4
gpt4 key购买 nike

我在这里尝试从根本上找到确实拥有某项事件所针对的运动和地区的用户。在 access [users] 表中有大约 17K 用户。每个人都可以有一定数量的运动兴趣和一个地区。

这里的查询查找至少拥有一项运动和一个区域的每个用户,这些用户是通过事件定位的。当我们选择每个 em 时,Sports 最多可以达到 75 [对于 IN 查询不太好]。

SELECT a.user, pp.courriel
FROM acces a
LEFT JOIN acces_profil_sport ap ON ap.id = a.id
LEFT JOIN profil_perso pp ON pp.id = a.id
WHERE ap.sport_id IN
(
SELECT ac.sport_id
FROM activite_sport ac
RIGHT JOIN activite a ON a.activite_id = ac.activite_id AND a.is_cron = 1 AND a.cron_processed = 0
)
AND pp.region_id IN
(
SELECT ar.region_id
FROM activite_region ar
RIGHT JOIN activite a ON a.activite_id = ar.activite_id AND a.is_cron = 1 AND a.cron_processed = 0
)
GROUP BY a.id

如果我删除运动查找,查询需要大约 30 秒才能运行。否则它会花费很长时间并且使用大约 99% 的 proc 与 mysql。

有什么帮助的提示吗?

[编辑:表结构]
访问:id(主键),用户,perso_id(配置文件的键/外键_perso[perso_id])[其他领域]
profil_perso : perso_id (primary key) courriel, region_id, id (foreign key to acces[id]) [一些其他领域]
acces_profil_sport : id/sport_id(双主键),niveau_id(双运动键 _id)

最佳答案

我怀疑你的索引有误。如果您打印出 explain select...,我可以对此做出更好的评论。此外,我很好奇你为什么要进行左/右连接和子选择。

在我看来,这些应该都是正常连接,因为两个左连接只有在它们存在时才有效。如果它们为空,则由于所需的子选择匹配,您将得不到一行。

至于右边的连接,你需要那里的 ar 位,它不是右边的一部分。我要么删除它们,要么让它们直接连接。我假设因为您正在检查看起来像未处理的 cron 工作,所以您想保留它们。

SELECT a.user, pp.courriel
FROM acces
JOIN acces_profil_sport ap ON ap.id = a.id
JOIN profil_perso pp ON pp.id = a.id
JOIN activite_sport ac ON ac.sport_id = ap.sport_id
JOIN activite a1 ON a.activite_id = ac.activite_id AND a.is_cron = 1 AND a.cron_processed = 0
JOIN activite_region ar ON ar.region_id = pp.region_id
JOIN activite a2 ON a.activite_id = ar.activite_id AND a.is_cron = 1 AND a.cron_processed = 0

关于php - 洞察查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/894092/

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