0

私は2つのテーブルを持っています

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 に答える