MySQL LEFT JOIN работает, но медленно, INNER работает, когда база данных заполнена - PullRequest
0 голосов
/ 11 сентября 2018

Я создаю страницу статистики для пользователей моего сайта, чтобы увидеть, насколько они взаимодействуют с различными функциями.На сайте они могут выполнять четыре вида деятельности, получать за них баллы и оставлять отзывы другим пользователям об их ответах.Все они записаны в базе данных.

  • В таблицах точек строка создается, когда пользователь впервые что-то делает, например, просматривает конкретное видео.Для каждого видео добавлена ​​новая строка.
  • В таблицах обратной связи создается строка для каждой уникальной части обратной связи с идентификатором пользователя, обратной связью и т. Д.

Проблема IЯ имею в виду, что в то время как два типа соединения работают, чтобы получить ожидаемый результат, INNER JOIN и LEFT JOIN, они имеют радикально различное время выполнения.

  • LEFT JOIN выполняется, но выполняется вечно (и впоследствии приводит к сбою моего компьютера с малой памятью!).
  • INNER JOIN выполняется, но только если во всех таблицах есть хотя бы одна подходящая строка для пользователя.

Поэтому я уверен, что здесь я пропускаю какой-то шаг эффективности или неправильно понимаю использование объединений в этом контексте.Я мог бы использовать помощь, глядя на оператор SQL и глядя на то, как его можно улучшить.

Fiddle Link: http://sqlfiddle.com/#!9/9dce51 (с ограниченными данными из-за размера!)

Проблемы с группами из восьми ниже - остальные запросы выполняются быстро и правильно.

SELECT      users.forename, users.surname, users.email, 
users_peer_request.user_id, COUNT(DISTINCT users_peer_request.id) as peer_req_cnt, 
COUNT(DISTINCT users_self_assessment.id) AS self_assess_cnt, AVG(users_self_assessment.assessment) AS self_assess_avg, 
GROUP_CONCAT(DISTINCT classes.name, '-', classes.id SEPARATOR ',') AS classes,

COUNT(DISTINCT a_experiment_points.id) AS tried_exp, 
COUNT(DISTINCT a_phetlabs_points.id) AS tried_phet, 
COUNT(DISTINCT a_videonotes_points.id) AS tried_video, 
COUNT(DISTINCT a_working_points.id) AS tried_work,                            
COUNT(DISTINCT a_experiment_feedback.id) AS fb_exp, 
COUNT(DISTINCT a_phetlab_feedback.id) AS fb_phet, 
COUNT(DISTINCT a_videonotes_feedback.id) AS fb_video, 
COUNT(DISTINCT a_working_feedback.id) AS fb_work

FROM        users_peer_request
LEFT JOIN   classes ON classes.id IN (SELECT classes_students.class_id FROM classes_students WHERE classes_students.student_id = users_peer_request.user_id) 
LEFT JOIN   users ON users.gid = users_peer_request.user_id
LEFT JOIN   users_self_assessment ON users_self_assessment.user_id = users_peer_request.user_id

INNER JOIN   a_experiment_points  ON   a_experiment_points.user_id =  users_peer_request.user_id
INNER JOIN   a_phetlabs_points    ON   a_phetlabs_points.user_id =  users_peer_request.user_id
INNER JOIN   a_videonotes_points  ON   a_videonotes_points.user_id =  users_peer_request.user_id
INNER JOIN   a_working_points     ON   a_working_points.user_id =  users_peer_request.user_id 
INNER JOIN   a_experiment_feedback  ON   a_experiment_feedback.user_fb_id =  users_peer_request.user_id
INNER JOIN   a_phetlab_feedback    ON   a_phetlab_feedback.user_fb_id =  users_peer_request.user_id
INNER JOIN   a_videonotes_feedback  ON   a_videonotes_feedback.user_id_fb =  users_peer_request.user_id
INNER JOIN   a_working_feedback     ON   a_working_feedback.user_fb_id =  users_peer_request.user_id

WHERE       users_peer_request.user_id = 123456789123456789123456
GROUP BY    users_peer_request.user_id

Этот запрос выполняется на скрипте, если, я надеюсь, он возвращает NULL или 0, если пользователь не отображается в таблице, и число, в противном случае это значение считается.

Большое спасибо,Я надеюсь, что у вас есть достаточно деталей здесь, но если нет, пожалуйста, спросите:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...