引言
最近使用MySQL做一些数据统计比较多。 有时候为了省事直接写出了一个略复杂的SQL查询, 直接获得最后的结果。 但是总是觉得比较慢。 下面做了一个改动,简述如下:
* 原来:
纯粹使用SQL查询, 得到最后的结果
* 改进:
使用SQL查询原始数据+Pandas进行数据处理
* 结论:
改进方案的性能提升了300%
原方案:
select t2_id, name, col2
from (
select sum(col1) as col1_sum, col2, t2.name, t2_id
FROM t1
left JOIN t2 on t2_id = t2.id
WHERE date > (NOW() - INTERVAL 12 HOUR) and col1 > 0 and price > 0 and bidfloor > 0
GROUP BY col2, t2_id
ORDER BY col1_sum desc
) t
order by t.col1_sum desc
思路还是比较清晰的, 就是比较慢。 一共花费了51s
新方案
- Step 1: 使用SQL读取原始数据
select col1, col2, t2.name, t2_id
from t1
left JOIN t2 on t2_id = t2.id
WHERE date > (NOW() - INTERVAL 12 HOUR) and col1 > 0 and price > 0 and bidfloor > 0
- Step2 : 使用Pandas进行Group / Count / Sort的操作
1 2 3 4 5 6 7 8 9 10 11 12 13 |
grpDF = df.groupby(by=["col2", "t2_id"]) datas = [] for name, subDF in grpDF : datas.append({ "col1_sum" : subDF['col1'].sum(), "col2" : name[0], "name" : subDF['name'].values.tolist()[0], 't2_id': name[1] }) df2 = pd.DataFrame(datas) df2 = df2.sort_values(by=['col1_sum'], ascending=False) df2 = df2[["t2_id", "name", "col2"]] |
计时结果:
* step1: 16s
* step2: 0.7s
* total: 16.7s, (原来: 51s)
补充: 为了不暴露真实表名、列名, 因此使用t1/t2/col1/col2替代真正的名字了
本文原创, 转载需要著名出处:www.flyml.net

文章评论
很有趣啊。。有没有看过数据库执行计划,哪里用时比较多?
感谢指点。对数据库了解不深, 还没有详细深入研究。