[英]how to optimise this MYSQL query to run faster
我有兩張桌子
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')
有什么方法可以使用join優化它嗎?
聯接優於子查詢試試看
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')
我建議使用顯式聯接而不是子查詢:
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不是由用戶生成的輸入填充的變量。 您應該使用綁定參數(方法將取決於您使用的語言。)
另一個查詢是這個...
SELECT COUNT(*)
FROM responses
INNER JOIN requests ON
(requests.request_id = responses.request_id)
WHERE status = 'U' AND
responses.user_id = '$User_id'
內部聯接的最大運行時間為max(table_1,table_2),對於嵌套查詢,多項式可能取決於查詢,所以是的,這是更快的...
有幾種方法可以加快sql速度
1)始終使用固定的行寬度,即始終不使用字符串varchar
2)良好的索引編制。
3)盡可能緩存。
緩存可以在服務器(代碼)上完成...或設置輔助只讀數據庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.