【发布时间】:2009-05-21 17:25:36
【问题描述】:
我在这里尝试基本上找到具有某项活动所针对的运动和地区的用户。在访问 [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 秒才能运行。否则它需要很长时间并且使用mysql的大约99%的proc。
有什么帮助吗?
[编辑:表结构]
访问权限:id(主键)、用户、perso_id(profil_perso[perso_id] 的键/外键)[some-other-fields]
profil_perso : perso_id (primary key) courriel, region_id, id (访问的外键[id]) [其他一些字段]
acces_profil_sport : id/sport_id (双主键), niveau_id (双键与sport_id)
【问题讨论】:
-
您能否列出您正在使用的表以及列是什么?
-
您的表是否正确编入索引?虽然这个查询不是很好,但在您正在使用的相对较小的数据集上,它似乎不应该花费那么。
-
您没有在该编辑中给我们 2 个表格。向我展示关于该查询的“解释”也会让我深入了解可能缺少索引的位置。
标签: php sql mysql optimization