2

私がやろうとしているのは、このクエリを高速化することです。現在、約15秒以上遅いです。r.emailv.sent、およびr.idr.viewed 、 r.savedの両方にインデックスがあります。EXPLAIN は両方のキーが使用されていることを示していますが、使用していることがわかりますUsing where; Using temporary; Using filesort

このクエリを改善するためのアイデアはありますか?

SELECT r.id, r.top, r.email
FROM request as r
WHERE r.viewed = 0 AND r.saved = 0 AND r.email NOT IN ( 
    SELECT v.sent FROM viewing as v WHERE v.sent = r.email
)
GROUP BY r.email 
ORDER BY r.top desc, r.date
LIMIT 100;
4

4 に答える 4

3

INMySQL は、句内の複数のレコードに一時テーブルを使用します。試す

SELECT r.id, r.top, r.email
FROM request as r
left outer join viewing v on v.sent = r.email
WHERE r.viewed = 0 AND r.saved = 0 AND v.sent is null
GROUP BY r.email 
ORDER BY r.top desc, r.date
LIMIT 100;
于 2012-08-23T04:58:00.483 に答える
2

LEFT JOIN代わりに使用NOT IN: なぜ..? ここを参照

SELECT r.id, r.top, r.email
FROM request as r
     LEFT JOIN viewing v
        ON r.email= v.sent
WHERE r.viewed = 0 AND 
      r.saved = 0 AND 
      v.sent IS NULL
GROUP BY r.email
ORDER BY r.top DESC, r.date
LIMIT 100;

最高のパフォーマンスを得るには、テーブルに次のインデックスを追加することを検討してください。できればインデックスをカバーします

ALTER TABLE request ADD INDEX ix1 (email, viewed, saved, top, date);

ALTER TABLE viewing ADD INDEX ix1 (sent);
于 2012-08-23T05:00:26.480 に答える
0
SELECT
  r.id,
  r.top,
  r.email
FROM
  request r
LEFT OUTER JOIN
  viewing v
ON
  v.sent = r.email
WHERE
  r.viewed = 0
AND
  r.saved = 0
AND
  v.sent IS NULL
GROUP BY
  r.email
ORDER BY
  r.top DESC, r.date
LIMIT 100
于 2012-08-23T04:58:15.563 に答える
0

どうやら MySQL にはサブクエリのパフォーマンスの問題があります。

幸いなことに、これを回避する方法があります。具体的には、サブクエリを結合に変換するか、特定のケースでは除外結合に変換します。

于 2012-08-23T04:58:47.420 に答える