👨🏫 10w+数据5S 打向MySQL.
其实这里也是可以横向扩展到100W+数据,只是把goroutine调大一点即可.
💡 1. 简单实现思路:
当我们使用一个 goroutine
的去进行增加的时候,不难会发现,会增加的很慢,我当初在用 Java
尝试使用一个 Conn
增加了1w
个数据(那个时候是测试上万数据查询效率问题),那个过程可想而知,等了我好久。。。
这几天,在写需求的时候,需要一次性(一次HTTP请求)打向 MySQL
中,我首先是通过事务来写入的,但是发现真的好慢,所以我改成了如下模式,通过在当前线程分发指定的数据给一个 goroutine
,让该协程负责打向MySQL指定数量的数据。但是这个度要把握好,什么意思呢?总价下来就是两个问题:1. 一共开多少 goroutine
2. 每个 goroutine
负责多少数据量呢? 这里我的依据是一个 goroutine
负责 1000条数据,那么根据当前需要插入多少条数据就可以计算出一共需要多少个 goroutine
了. 代码如下.
💡 2. 代码.
我把生成MD5的xcommon和日志组件xlogging删掉了,需要的可以自行补全.
1 | go复制代码package cdkmod |
效果图:
- StartTime
- EndTime
修改Batch
方法,
1 | go复制代码func batch(data map[int64]string, ch chan int, actExchangeID string, log *xlogging.Entry) { |
如果改用这样的SQL来进行增加,时间可以压缩在5秒之内.
💡 3. 总结:
其实以后在面对这种大数据量增加的情况下,我们只需要协调 goroutine
的数量以及每个 goroutine
负责的数据部分即可。只要调理好了,10S百万数据也不是不可以的哈~
如果要搞10S百万数据的话,我们可以分10个goroutine
去处理,每个分10w条数据,那么当10个 goroutine
同时进行的时候,就相当于一个goroutine在进行,所以把时间进行压缩、CPU利用率提高就可以达成10S百万数据的存储了。
本文转载自: 掘金