2012-06-09 5 views
0

У меня есть две таблицыкак оптимизировать этот MYSQL запрос работать быстрее

requests - request_id, request_message, user_id 
responses - response_id, request_id, response_message, user_id, status 

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

SELECT COUNT(*) 
FROM RESPONSES 
WHERE status = 'U' 
and request_id IN (SELECT request_id FROM requests WHERE user_id = '$User_id') 

Есть ли способ оптимизировать его, используя соединение?

ответ

1

Я предложил бы использовать явное объединение вместо подзапроса:

SELECT 
count(*) 
FROM 
    responses res 
INNER JOIN 
    requests req 
ON 
    req.request_id=res.request_id 
WHERE 
    req.user_id='$User_id' 
    and res.status='U'; 

являются поля REQUEST_ID индексируются? Я предполагаю, что это PKEY в запросах. Как насчет поля user_id в запросах?

Кроме того, хотя я скопировал ваш синтаксис для него, я надеюсь, что $ User_id не является переменной, заполняемой вводом пользователем. Вы должны использовать параметры связывания (метод будет зависеть от того, какой язык вы используете.)

+0

Большое спасибо !!! request_id - это PKEY в запросах. user_id - это PKEY у пользователей, а FKey - в запросах. $ User_id - user_id зарегистрированного пользователя. Я использую perl. –

1

присоединяется лучше подзапроса попробовать это

SELECT COUNT(*) 
FROM responses r 
INNER JOIN requests rrs ON rrs.request_id = r.request_id 
WHERE r.status = 'U' 
and r.user_id = '$User_id') 
1

Другой запрос был бы это ...

SELECT COUNT(*) 
FROM responses 
    INNER JOIN requests ON 
     (requests.request_id = responses.request_id) 
WHERE status = 'U' AND 
     responses.user_id = '$User_id' 

максимальное время выполнения для внутреннего соединения составляет не более (table_1 , table_2), для вложенных запросов может быть полиномиальных в зависимости от запроса, так что да это быстрее ...

Theres несколько способов ускорить SQL
1) всегда используют фиксированную ширину строки, т.е. нет строк всегда варчар
2) хорошее индексирование.
3) кеширование когда возможно.
Кэширование может выполняться на сервере (код) ... или при создании дополнительной базы данных только для чтения.

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