2016-09-19 332 views
0

我需要優化MySQL查詢。我有一張賭桌,賭注少於100.000條記錄。我需要顯示當月的所有記錄。Mysql優化查詢日期

SELECT betting.id 
FROM betting, members 
WHERE members.status = 1 
and members.id = betting.user 
and betting.date between '2016-09-01' and '2016-09-30' 
and betting.status = 1 
and betting.type = 1; 

當我嘗試解釋命令:

SIMPLE betting range user,date,type,type_2 type_2 7 NULL 4966 Using where 
SIMPLE members eq_ref PRIMARY PRIMARY 4 betting.user 1 Using where 

是否有任何機會,以減少對數據庫的搜索?問題是顯示此結果的頁面太頻繁地被調用,並且會導致大量的CPU成本。不幸的是,我無法緩存結果,因爲它們需要生存。有任何想法嗎 ?

+0

您是否在任何相關列上都有索引 – RiggsFolly

+0

您可以在mysql中使用緩存依賴關係。這意味着你將把結果保存在緩存中,直到表更改。 –

+0

@RiggsFolly是的,我有一個索引(類型,結果,狀態) –

回答

1

這是您的查詢的格式寫入是容易(至少對我來說)瞭解:

SELECT b.id 
FROM betting b join 
    members m 
    ON m.id = b.user 
WHERE m.status = 1 
     b.date between '2016-09-01' and '2016-09-30' and 
     b.status = 1 and 
     b.type = 1; 

我認爲最好的索引策略是:betting(status, type, date, user)members(id, status)

+0

我同意你的可讀性,但是這個查詢並沒有幫助我。目前仍需要搜索5000行左右。我不確定我的查詢是否可以優化更多... –

+1

@VinceCarter。 。 。你添加了索引嗎? –

+0

是的,現在情況並沒有改變很多:1 SIMPLE b範圍用戶,日期,類型,type_2 type_2 5 NULL 4759使用索引條件 1 SIMPLE m eq_ref PRIMARY,id PRIMARY 4 b.user 1使用Where Where –