2012-06-09 112 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' 

最大运行时间内连接为max(TABLE_1 ,用于根据查询嵌套查询也许多项式TABLE_2), , 所以是的,这是更快...

那里有一对夫妇的方式加快SQL
1)总是使用固定的行宽,即没有串always varchar
2)好的索引。 3)尽可能高速缓存。
可以在服务器(代码)上完成缓存...或设置辅助只读数据库。