1. 程式人生 > >MySql 的group by having 優化案例

MySql 的group by having 優化案例

Background:
1.pay_award_log為一張稽核表,表有重複的記錄,資料約51W條
2.award_time欄位有btree索引,operator欄位沒有索引,根據operator和award_time查詢頻率是一樣的
3.operator為後臺稽核人,uid是使用者欄位,使用者在一天內可能有多條記錄,求175587這個後臺人員一天內稽核的使用者數,需要根據uid排除重複的記錄

select count(*) no from
(select * from pay_award_log group by uid having award_time between UNIX_TIMESTAMP(‘2017-12-07 0:0:0’) and UNIX_TIMESTAMP(‘2017-12-07 23:59:59’) and operator = 175587 ) as award_count
這樣子的查詢需要耗時0.6-0.8秒,處女座程式設計師是絕對接收不了這樣的龜速的,況且一個頁面還有多條這樣的sql要查詢,一個頁面有9條這樣的查詢,開啟這個統計的頁面要7-8秒真的是超級慢!

分析SQL:
1.這裡查詢慢group by是一個很關鍵的因素,考慮幹掉他,用程式去去重
2.多條這樣的sql就是where operator = 175587、operator = xxxxx這樣的,直接去掉operator, 保留一個索引的where條件,用程式去過濾條件
3.再把統計為昨天的資料增加上快取,今天的資料也增加上快取,當天的資料快取時間設定短點5-30分鐘這樣
整個優化方案下來頁面訪問速度提升到0.3S,比之前的訪問速度提升了25倍,有快取的情況下直接秒讀