我有两张桌子
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 ??
来优化它答案 0 :(得分: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 :(得分: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不是由用户生成的输入填充的变量。您应该使用绑定参数(该方法取决于您使用的语言。)
答案 2 :(得分:1)
另一个问题是......
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)尽可能缓存。
缓存可以在服务器(代码)上完成......或者设置辅助只读数据库。