0

ここで、結合に一致しない結果を取得することで何か特別なことを行うクエリを作成しました (この SO の質問で示唆されているように)。

SELECT cf.f_id
FROM comments_following AS cf
INNER JOIN comments AS c ON cf.c_id = c.id
WHERE NOT EXISTS (
    SELECT 1 FROM follows WHERE f_id = cf.f_id
)

これをスピードアップする方法についてのアイデアはありますか? 30k から 200k の行があり、インデックスを使用しているように見えますが、クエリはタイムアウトします。

説明/説明 情報:

1   PRIMARY c   ALL PRIMARY NULL    NULL    NULL    39119   
1   PRIMARY cf  ref c_id, c_id_2    c_id    8   ...c.id 11  Using where; Using index
2   DEPENDENT SUBQUERY  following   index   NULL    PRIMARY 8   NULL    35612   Using where; Using index
4

3 に答える 3

1

commentsテーブルがクエリで明示的に使用されていません。フィルタリングに使用されていますか?そうでない場合は、次を試してください。

SELECT cf.f_id
FROM comments_following cf
WHERE NOT EXISTS (
    SELECT 1 FROM follows WHERE follows.f_id = cf.f_id
)

ところで、これで構文エラーが発生する場合 (follows.f_id が存在しないため)、それが問題です。その場合、相関サブクエリがあると思うかもしれませんが、実際にはありません。

またはleft outer joinバージョン:

SELECT cf.f_id
FROM comments_following cf left outer join
     follows f
     on f.f_id = cf.f_id
where f.f_id is null

インデックスをオンにfollows(f_id)すると、これらのバージョンの両方がより高速に実行されるはずです。

于 2013-05-31T22:07:16.577 に答える
1

LEFT JOIN は、WHERE NOT EXISTS サブクエリよりも高速な場合があります。試してください:

SELECT cf.f_id
FROM comments_following AS cf
INNER JOIN comments AS c ON cf.c_id = c.id
LEFT JOIN follows AS f ON f.f_id = cf.f_id
WHERE f.f_id IS NULL
于 2013-05-31T20:33:44.140 に答える
0

この問題に対する答えは、 に 2 番目のインデックスを配置することでしたfollows.f_id

于 2013-05-31T23:08:41.587 に答える