現在我的需求是這樣的,
每一個使用者會產生 N 多訂單 現在要排序 訂單數量從大到小 的使用者.
如果按照傳統 我先將每一個使用者的訂單總數統計,然後進行排序.這樣一但資料量變大基本無法排序會很消耗系統資源統計時間也會變長.請問有什麼方法嗎?
回複內容:
現在我的需求是這樣的,
每一個使用者會產生 N 多訂單 現在要排序 訂單數量從大到小 的使用者.
如果按照傳統 我先將每一個使用者的訂單總數統計,然後進行排序.這樣一但資料量變大基本無法排序會很消耗系統資源統計時間也會變長.請問有什麼方法嗎?
0.假設一天幾十萬的訂單,搞個指令碼,每天跑一次,統計一天的訂單數
1.根據訂單時間從資料庫擷取每天的總訂單
可以為時間加上索引
2.根據取出的資料,從程式方面,按使用者分組,統計訂單中每位使用者的訂單數
不要用sql來做分組統計,因為資料庫壓力會非常大,可以放到php中來做處理,統計這些訂單中的每一個使用者有多少訂單,相當於sql中的group by user
3.然後加到使用者的訂單總數中,可以放到redis中
像這種情況,可可以新增統計表呀。各種統計資料可以每天定時統計呀。然後就不用每次都要去統計一遍嘍。
使用者表增加一個訂單總數和訂單總金額的欄位不就行了...
這是典型的空間時間轉換嘛。。。既然你效能跟不上只能加欄位或者看需求了,或者換一種資料庫會稍微好一點
如果你有這樣的業務需求的話,我建議在使用者的這個表中增加一個列,就是計算使用者購買的訂單的數量列。這樣使用者每建立一個訂單則就+1,最後排序的時候,可以直接按照這個欄位排序就ok了。簡單快捷。
使用者表 user
id | name1 | 張三2 | 李四3 | 王五4 | 趙六
訂單表 order
user_id | orderNo1 | 11111112 | 22222221 | 33333333 | 44444443 | 55555552 | 66666663 | 77777773 | 88888882 | 9999999
查詢語句
select a.id,a.name,ifnull(b.num,0) as order_num from user as a left join
(select user_id,count(orderNo) as num from order where 1 group by orderNo) as b on a.id=b.user_id order by b.num desc
查詢結果
id | name | order_num3 王五 42 李四 31 張三 24 趙六 0
那你可以直接在一個sql裡面查詢就好了:
select count(*) as num from `order` group by id