0

我有两张桌子

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来优化它吗?

4

3 回答 3

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')
于 2012-06-09T07:29:01.247 回答
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 不是由用户生成的输入填充的变量。您应该使用绑定参数(该方法将取决于您使用的语言。)

于 2012-06-09T07:30:21.923 回答
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) 尽可能缓存。
缓存可以在服务器(代码)上完成......或设置一个辅助只读数据库。

于 2012-06-09T07:41:09.660 回答