表結構iMoney 類型:float dtEventTime 類型:datetime iType 類型:tinyint iAction 類型:tinyint現在存在的索引(test)是:iType 跟 dtEventTime 的一個組合索引select sum(iMoney) as iMoney,iAction from CostMoney where iType = 3 and dtEventTime between '2012-09-29' and '2012-09-30' group by iAction這條語句查詢后explain 下id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE CostMoney range test test 9 NULL 3893 Using where; Using temporary; Using filesort
2 回答

幕布斯7119047
TA貢獻1794條經驗 獲得超8個贊
給你點建議:
1、按天分表,這樣每個表就不會那么大
2、用另一個緩存、或者表專門累加iMoney,每天的分記錄,產生一條累加一次
3、group by iAction order by NULL ?(天知道有沒有效果)

aluckdog
TA貢獻1847條經驗 獲得超7個贊
首先,dtEventTime必須要有索引的。而且dtEventTime類型應該是int,不應該使用date的。否則索引效率太低。
其次,分析這個sql的頻率高么?
如果只是幾次之類的話,而且數據要求不是實時的話,可以考慮循環取數據,程序里面做group和sum的功能。
如果很頻繁,數據要求實時,只能考慮單獨對每一個iAction建立單獨的計數器。
最后,sql應該盡量簡單,最理想的情況每次取數據都走索引。數據庫更多的是存數據,盡量減少每次sql的cup和io資源。數據庫的資源很寶貴,擴展成本比較高。
添加回答
舉報
0/150
提交
取消