2015-06-02 3 views
0

У меня есть система бронирования запросов, которая позволяет комментировать билеты. Я добавил функцию, которая показывает пользователю при входе в систему последний комментарий к любому из своих билетов в качестве подсказки, если что-либо изменилось со времени их последнего посещения. Я могу выполнить это с суб-суб-select, который отлично работает с небольшой базой данных, но я подозреваю, что он не будет масштабироваться с течением времени.Оптимизация подзапроса в MySQL

-- stage 1: all user's request ticket ids 
SELECT id FROM requests WHERE username='someuser'; 

-- stage 2: most recent comment on all user's request ticket ids 
SELECT 
    MAX(commented_at) 
FROM 
    requests_comments 
WHERE 
    request_id IN (
    -- stage 1 
    SELECT id FROM requests WHERE username='someuser' 
); 

-- final stage: whole comment row of any user's most recent comment 
-- on all of selected user's request tickets 
SELECT 
    * 
FROM 
    requests_comments 
WHERE 
    commented_at=(
    -- stage 2 
    SELECT 
     MAX(commented_at) 
    FROM 
     requests_comments 
    WHERE 
     request_id IN (
     -- stage 1 
     SELECT id FROM requests WHERE username='someuser' 
    ) 
); 

Я пытался возиться с GROUP BY и HAVING, но не получили, где мне нужно быть.

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

Как я могу оптимизировать свой запрос для обеспечения производительности с течением времени?

ответ

2

Если вы хотите только самый последний комментарий для данного пользователя, то вы можете выразить это так:

SELECT rc.* 
FROM requests r JOIN 
    requests_comments rc 
    ON rc.request_id = r.id 
WHERE r.username = 'someuser' 
ORDER BY rc.commented_at DEC 
LIMIT 1; 

Для повышения производительности, вы хотите индекс на requests(username, id) и request_comments(request_id).