一个新手同学写了一个从mysql中导出数据的程序,时间太长了要80分钟,我们如何去优化它呢?
老手:你可以试试采用分城市导出而不是一下导出全国数据,因为最后生成的数据是以城市为单位的;
新手:我按照城市的citycode 取模10,每次导出10分之一城市的数据,这样需要的内存减少了,处理的时间下降到60分钟了。
老手:你的程序还是串行处理的,你可以采用多进程的方式,取模值作为参数传给你的进程,这样是并发导出的。
新手:果然见效啊,我导出数据的时间变成30分钟了。
老手:没有道理仍需要花费30分钟的时间,按照上面串行是60分钟的时间计算,这个时间应该更短才对。
新人:哦,原来按照citycode取模这样不均匀,有些城市的数据比较多,被分到一起了,最后导致导出的时间是以这个最长的为准的。
老手: 我们可以统计每个city下面的数量,不用cityid取模的方式,而是尽量均匀的打散,这样就会每个进程导出时间均等了。
新人:现在这个响应时间已经满足要求了,暂时不用优化了吧。
老手:优化方式还有很多,比如取模值可以采用CPU数,我们机器一般都是12核的;还有可以考虑多机的并发,如果瓶颈在数据库也可以考虑拆表等;
新人:…….