2016-11-07 10 views
0

ここで、私はここで勉強しましたが、このクエリを最適化する方法を見つけることができませんでした。レポートのクエリを最適化する方法

SELECT ad_request.user_id, 
    ads.req_id, 
    ads.id as doneId 
FROM ads 
    INNER JOIN ad_request ON ads.req_id = ad_request.req_id 
WHERE 
    (ads.user_id='3612185701') AND ads.date>DATE_ADD(NOW(),INTERVAL -4 DAY) 
ORDER BY ads.id 

クエリダイジェスト:

# Attribute pct total  min  max  avg  95% stddev median 
# ============ === ======= ======= ======= ======= ======= ======= ======= 
# Count   0  836 
# Exec time  17 322s 481us  11s 385ms  2s 956ms 51ms 
# Lock time  0 203ms 103us 23ms 242us 332us 787us 185us 
# Rows sent  67 209.30k  0 3.56k 256.36 1.46k 478.03 1.96 
# Rows examine 1 1021.57k  0 55.08k 1.22k 4.71k 3.05k 202.40 
# Rows affecte 0  0  0  0  0  0  0  0 
# Query size  0 218.29k  262  268 267.38 258.32  0 258.32 

ダイジェストはわずか30分のフレームからである、このクエリの、時には複数のインスタンスが100秒間動けなくなる

+0

「行の検査」と「行の送信」は多岐にわたっているため、「実行時間」には多種多様があります。 Gordonは最適なインデックスを提供します。 –

答えて

1

これはあなたのクエリです:

SELECT ar.user_id, a.req_id, a.id AS doneId 
FROM ads a INNER JOIN 
    ad_request ar 
    ON a.req_id = ar.req_id 
WHERE a.user_id = '3612185701' AND 
     a.date > DATE_ADD(NOW(), INTERVAL -4 DAY) 
ORDER BY ads.id; 

私は次のインデックスで開始します:ads(user_id, date, req_id, id)およびad_request(req_id, user_id)

また、user_idが文字列でない場合は、'3612185701'を一重引用符で囲みます。不適切な型の使用は、オプティマイザと人を混乱させる可能性があります。

+0

@Desas。 。 。私がクエリをフォーマットする方法は、第1章「SQLとExcelを使ったデータ分析」で説明しています。あなたの変更は、私の意見では改善ではありませんでした。 –

+0

お返事ありがとうございました。ご返事ありがとうございました。私は何かに巻き込まれており、チェックする時間がありませんでした。 私はすでにこのインデックス "ad_request(req_id、user_id)"を持っていましたが、大きなテーブルにそのようなインデックスを付けるのは大丈夫ですか?私はそれが既に9000万行を持ち、毎日増えていることを意味します。 私はすでにadd => id、add_id、date、req_id、id + req_id、id + add_id、 –

+0

というインデックスを持っています。ディスクの場合(+ ram?)。 あなたは適切にクエリとインデックスを作成する方法をどこで知ることができますか教えてください。今はコースに出席できませんが、本物のことを本当に学び理解するために必要なことがあれば、書籍や記事を読んだり、YouTubeチャンネル全体を見ることができます。 –

関連する問題