大家好,我是一個sql學齡3個月的新手,最近因為工作需求
需要從兩個mysql伺服器撈取資料來計算報表,目前因為趕
時間,先用了簡單的語法做完,但日後資料量變更多應該會
變很慢,所以想跟大家請教比較有效率的方法。
1. DB架構
目前主要用到的DB分在兩台機器上,一台存log (玩家uid,
貨類型,貨幣增銷量,時間戳,etc)約有300萬筆資料、一台存
玩家資訊(玩家uid,創角時間,等級,最後上線,etc),約3萬筆資
料,常用的table都有建索引了。然後兩台DB跟正在開發的報
表後台都在同一個內網。
2. 需求與目前作法
目前我的需求是取出某時段內創角的玩家(有時會換成時段
內還有上線的玩家)的貨幣增銷統計。
而我目前因為時間有限,先用最簡單的方法做:
(1)把目標uid撈出來
SELECT GROUP_CONCAT(QUOTE(playerdb.player.uid))
FROM playerDB.player
WHERE created_at >= time1 AND created_at < time2
(2)把這串uid用c#串成sql指令到log DB撈資料
SELECT uid, currency_type, SUM(value)
FROM logDB.log.currency_log
WHRERE uid IN (一長串uid) AND currency_type = n
GROUP BY uid
3. 我的問題
之前有過幾次經驗,當我用where not in 語法篩選資料時,
如果not in 裡面的條件太多就會跑很久,有時會久到被中斷
連線(但where in 還沒遇過,我也不太確定),所以有點
怕遊戲正式對外開放時我的查詢會崩潰。
之前問過DBA同事,他們說可以用inner join的話會比where
好,但資料分散在兩台機器上,我沒辦法直接做join。為了
join我還試過用transaction 在logDB開temporary table,用
Dapper(.NET一個評價頗高的ORM套件)把撈到的uid insert
到這個暫存表,但光insert 150多筆資料就花了7秒...所以只
好放棄。想請問各位前輩,在我這種狀況下,該如何提升我
的查詢效能,以應付將來更大的資料量?懇請各位指點,謝
謝!手機排版,如果有點凌亂請見諒。