Я пытаюсь найти пользователей, которые имеют виды спорта и регионы, на которые ориентирован вид деятельности. В таблице acces [users] есть около 17K пользователей. У каждого может быть определенное количество спортивных интересов и один регион.
Здесь запрос ищет всех пользователей, которые имеют хотя бы один вид спорта и один регион, на которые ориентированы действия. Спорт может быть до 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% процесса с mysql.
Какие-нибудь подсказки, чтобы помочь этому?
[редактировать: структура таблицы]
Доступ: id (первичный ключ), пользователь, perso _
id (ключ / внешний ключ к профилю _
perso [perso _
id]) [some-other-fields]
профиль _
чел.: чел. _
id (первичный ключ), курриель, регион _
id, id (внешний ключ для доступа [id]) [некоторые другие поля]
доступ _
профиль _
спорт: идентификатор / спорт _
идентификатор (двойной первичный ключ), niveau _
идентификатор (двойной ключ со спортом _
идентификатор)