0

現在、ロードに長い時間がかかる SQL クエリがあります。私はMySQLにかなり慣れていません。

これはクエリです:

SELECT applicationid 
FROM logs 
WHERE action = 'VIEWED' 
AND userid = '$user' 
AND date >= '$dateminus7' 
AND applicationid NOT IN (
     SELECT applicationid 
     FROM logs 
     WHERE userid = '$user' 
     AND date >= '$dateminus7' 
     AND (action LIKE 'SUBMITTED NOTE%' OR action LIKE 'CHANGED STATUS%')
)

基本的に、いくつかのデータベースを調べて、顧客アカウントにアクセスしたときにメモを残さないユーザーを見つけます (非常にいたずらです)。ログ データベースには 1 週間あたり約 30,000 レコードがあり、これは明らかに要因ですが、現在、クエリは 1 時間実行され、まだ完了していません (タイムアウト、PHP ページの 404 エラー)。

必要な情報があれば質問してください。ヒントや指針をいただければ幸いです。

編集:結果を説明http://i.imgur.com/h9bZBe3.png

4

3 に答える 3

1

ここで両方のクエリを高速化するには、上の複合インデックスで(userid, date)十分です。(userid, date, action)またはを試すこともできます(action, userid, date)。一意の値が多い列によっては、あるインデックスが別のインデックスよりも効果的である可能性があります。

クエリ プランナーはサブクエリを最適化できない可能性があり、外部クエリの候補行ごとにサブクエリを 1 回実行する可能性があることに注意してください。内部クエリを複数回実行するコストは、パフォーマンスの問題の一因となる可能性があります。代わりに結合を試すことを検討し、パフォーマンスが向上するかどうかを確認してください。

SELECT la.applicationid 
FROM logs la

LEFT OUTER JOIN logs lb
    ON la.applicationid = lb.applicationid
    AND lb.userid = '$user' 
    AND lb.date >= '$dateminus7' 
    AND (lb.action LIKE 'SUBMITTED NOTE%' OR lb.action LIKE 'CHANGED STATUS%')

WHERE la.action = 'VIEWED' 
AND la.userid = '$user' 
AND la.date >= '$dateminus7' 
AND lb.applicationid IS NULL;
于 2013-04-29T15:35:52.783 に答える