1

次の、パフォーマンスの遅い SQL クエリがあります。

SELECT *
FROM news_events
WHERE 1 AND (user_id = 2416) OR id IN(SELECT content_id FROM likes WHERE user_id = 2416)
ORDER BY id DESC
LIMIT 0,10

news_eventsテーブルには、user_id のインデックスがあります。likesテーブルにはuser_id のインデックスがあります。

パフォーマンスを改善するために、次のように INNER JOIN を使用してクエリを書き直しました。

SELECT a.*
FROM news_events a
INNER JOIN likes b ON (a.id = b.content_id)
WHERE (a.user_id = 2416) OR (b.user_id = 2416)
ORDER BY a.id DESC
LIMIT 0,10

しかし、パフォーマンスも向上しません。この最後のクエリで Explain を実行した結果は次のとおりです。

mysqlの説明

このクエリのパフォーマンスを向上させるために何ができるかについての指針をいただければ幸いです。

4

3 に答える 3

1

このクエリを試してください -

SELECT * FROM news_events ne
LEFT JOIN (SELECT content_id FROM likes WHERE user_id = 2416) l
  ON ne.user_id = 2416 OR ne.id = l.content_id
ORDER BY
  ne.id DESC
LIMIT
  0, 10

次の列にインデックスを付ける必要があります: news_events.user_id、、、、。news_events.idlikes.user_idlikes.content_id

于 2013-04-22T13:32:53.083 に答える
0

あなたのクエリは十分に良いです。仲間からの質問投稿もOKです。ただし、大量のデータ セットがあり、長い間インデックスを再構築していない場合は、両方のテーブルでインデックスを再構築する必要があります。

データベース管理者がすべてのインデックスをタイムリーに再構築し、データベース内のすべてのオブジェクトとパッケージを再コンパイルする必要があるのは標準的なプロトコルです。

私はそれが役立つことを願っています:) クエリを続けてください!

于 2013-04-23T06:53:21.840 に答える