2016-11-07 32 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

「行檢查」和「行發送」有很多種,因此您可以期待「執行時間」的種類繁多。戈登提供了最佳的指標。 –

回答

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。 。 。我使用SQL和Excel *進行數據分析的第1章介紹了格式化查詢的方式。在我看來,你的改變不是一種改進。 –

+0

嘿男人,謝謝你的回覆,我真的很抱歉,因爲我遲遲沒有迴應,所以我沒有時間檢查 我已經有了這個索引「ad_request(req_id,user_id)」,但沒有其他的,在一張​​大桌子上放置這樣的指數可以嗎?我的意思是它有9000萬行,並增加每天 順便說一下,我已經有這個索引add => id,add_id,date,req_id,id + req_id,id + add_id, –

+0

什麼是折衷索引,時間對於磁盤(+ ram?); ,你能告訴我在哪裏可以學習如何正確查詢和索引?我現在無法參加課程,但我可以閱讀多少書籍和文章,或看整個YouTube頻道,如果這是我需要真正學習和理解這些東西。 –