2014-09-12 2 views
-1
SELECT a.gid, a.qid, 
     SUM(a.result = 1) first_attempt_correct, 
     SUM(a.result = 0) first_attempt_incorrect 
     FROM maf_game_stats a 
       LEFT JOIN 
       (
        SELECT USERID, gid, QID, MIN(ACCESSTIME) min_date 
        FROM maf_game_stats 
        GROUP BY USERID, gid, qid 
       ) b ON a.USERID = b.USERID AND 
        a.gid = b.gid AND 
        a.qid = b.qid AND 
        a.ACCESSTIME = b.min_date 
     WHERE a.gid ='2' 
     AND a.ACCESSTIME >= '2014-09-01' AND a.ACCESSTIME < '2014-09-10' + INTERVAL 1 DAY 
     GROUP BY a.gid, a.qid 

Вышеприведенные время выполнения запроса 40 до 50 сек, как я могу разбить thses запросMySQL запросов внутреннее соединение занял 40 до 45 сек

+0

Или как переписать я уже используется индексирование, но не использовать ..? – Vasanth

+0

Невозможно индексировать левую таблицу, полученную в результате соединения, не уверен, почему вы просто не присоединяетесь к фактической таблице и не добавляете некоторые группы? – exussum

+0

Как минимум, обновите свой вопрос с помощью объяснения и определений таблиц. – Kermit

ответ

0

Окончательное решение ниже:

SELECT a.gid, a.qid, 
     SUM(a.result = 1) first_attempt_correct, 
     SUM(a.result = 0) first_attempt_incorrect 
     FROM maf_game_stats a 
       INNER JOIN 
       (
        SELECT USERID, gid, QID, MIN(ACCESSTIME) min_date 
        FROM maf_game_stats 
        WHERE gid ='2' 
        AND ACCESSTIME >= '2014-09-01' AND ACCESSTIME < '2014-09-12' + INTERVAL 1 DAY 
        GROUP BY USERID, gid, qid 
       ) b ON a.USERID = b.USERID AND 
        a.gid = b.gid AND 
        a.qid = b.qid AND 
        a.ACCESSTIME = b.min_date 
     WHERE a.gid ='2' 
     AND a.ACCESSTIME >= '2014-09-01' AND a.ACCESSTIME < '2014-09-12' + INTERVAL 1 DAY 
     GROUP BY a.gid, a.qid 
0

Добавить

WHERE GID = '2'

к ваш внутренний запрос левого соединения. Без этого вы запрашиваете ВСЕ значения «gid». Итак, поскольку ваш внешний запрос заботится только о «gid = 2», кто заботится, есть ли у вас «gid = 1, 3, 2903 или даже 389433» во внутреннем результирующем наборе. Иметь то же самое, и это должно быть мгновенно.

Кроме того, вам может потребоваться применить критерии дат к внутреннему запросу, но не обязательно точно, что вы пытаетесь выбраться из него.

+0

gid означает идентификатор игры, его максимальный номер содержит только числа от 1 до 15. – Vasanth

+0

@ Vasanth, что было последним в пересмотренном запросе с предложением WHERE. Вы упомянули 8-10 для ответа Гордона, но отметили мое решение как то, что работало ... более любопытно, а также хорошие отзывы в будущем при работе с медленными запросами, а также то, что работает, и конечная производительность может помочь другим увидеть измеримые различия в методах , – DRapp

0

Я бы предложил написать это с помощью not exists, а затем добавить некоторые индексы. Запрос:

SELECT gs.gid, gs.qid, 
     SUM(gs.result = 1) first_attempt_correct, 
     SUM(gs.result = 0) first_attempt_incorrect 
FROM maf_game_stats gs 
WHERE gs.gid ='2' AND 
     gs.ACCESSTIME >= '2014-09-01' AND gs.ACCESSTIME < '2014-09-10' + INTERVAL 1 DAY AND 
     NOT EXISTS (SELECT 1 
        FROM maf_game_stats gs2 
        WHERE gs2.gid = gs.gid and gs2.qid = gs.qid and gs2.AccessTime > gs2.AccessTime 
       ) 
GROUP BY gs.gid, gs.qid; 

индексов являются: maf_game_starts(gid, accesstime, qid, result) и maf_game_stats(gid, qid, AccessTime).

+0

он работал хорошо, потребовалось 8 - 10 секунд. спасибо loot теперь я проверяю разными способами;) – Vasanth

+0

время выполнения увеличено. но результат попытки запроса правильный, неверный нечестный. – Vasanth

Смежные вопросы