大家好,我是一个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秒...所以只
好放弃。想请问各位前辈,在我这种状况下,该如何提升我
的查询效能,以应付将来更大的资料量?恳请各位指点,谢
谢!手机排版,如果有点凌乱请见谅。