如何优化此MYSQL查询以更快地运行

时间:2012-06-09 07:23:03

标签: 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')

有没有办法使用join ??

来优化它

3 个答案:

答案 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)尽可能缓存。
缓存可以在服务器(代码)上完成......或者设置辅助只读数据库。