作者funnytseric (咩~~)
看板Database
标题[SQL] MySQL 如何有效率的从两个伺服器筛选大量
时间Sat Sep 8 12:34:37 2018
大家好,我是一个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秒...所以只
好放弃。想请问各位前辈,在我这种状况下,该如何提升我
的查询效能,以应付将来更大的资料量?恳请各位指点,谢
谢!手机排版,如果有点凌乱请见谅。
-----
Sent from JPTT on my iPhone
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.136.196.69
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Database/M.1536381279.A.B5D.html
1F:→ retsamsu: Google MySQL federated engine 可像存取本地端的 tab 09/08 13:13
2F:→ retsamsu: le 一样存取远端 table 09/08 13:13
3F:→ funnytseric: 原来还有这样的方法啊,谢谢,我去google一下 09/08 14:03