python myql类库MySQLdb在数据过量情况下巨慢无比的原因分析

2009年 9月27日晚上快下班时分,有群里面的朋友说python的MySQLdb在检索百万数据量的时候巨慢无比,要达到20分钟左右。由于自己的一些项目也用到了MySQLdb,所以特别注意了一下,于是翻阅了源代码。而后经过大半天对其源码的分析,初步得出一些结论。

MySQLdb的性能影响主要是由于_mysql.c代码页中的self->use以及个别函数中的use参数=1或者0时引起的。由于在函数_mysql_ResultObject_Initialize中,利用:

self - >use = use;
Py_BEGIN_ALLOW_THREADS;
if (use )
    result = mysql_use_result ( & (conn - >connection ) );
else
    result = mysql_store_result ( & (conn - >connection ) );

由这段来决定是采用mysql_use_result还是mysql_store_result。众所周知mysql_use_result连MySQL官方都不大推荐。建议上述代码中将if (use)改为if(self->use==1),此外建议将函数_mysql_ConnectionObject_store_result中的:

arglist = Py_BuildValue ( "(OiO)", self, 1, self - >converter );

改为:

arglist = Py_BuildValue ( "(OiO)", self, 0, self - >converter );

另外将_mysql_ConnectionObject_use_result函数中的:

arglist = Py_BuildValue ( "(OiO)", self, 1, self - >converter );

改为:

arglist = Py_BuildValue ( "(OiO)", self, 0, self - >converter );

总之说了这么多,关键是尽可能使用mysql_store_result

为了便于大家对MySQLdb的理解,我把修改成功的代码附上。我用的是1.2.3的测试版,为了不和你已经安装的MySQLdb冲突,我把相关代码都改成了mysqldb2,模块名称都是_mysql2.so。打开代码后,make一下会自动生成_mysql2.so。然后执行外面一个测试的代码:

python test1.py

尤其在数据超过200w后,可能会发现这个效果。原先需要20分钟,现在大概几十秒。修改后的源码我放在QQ群共享里面。

不知道现在还在不在

 

QQ群:24683344 ,里面有一些牛人。从事方向各不相同。

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值