我在应用程序中找到了mysql的execute()
函数的缓慢。我精心设计了一个简单的SQL查询来举例说明这个问题:
SELECT * FROM `cid444_agg_big` c WHERE 1
>>> import MySQLdb as mdb
>>> import time;
>>>
>>> dbconn = mdb.connect('localhost','*****','*****','*****');
>>> cursorconn = dbconn.cursor()
>>>
>>> sql="SELECT * FROM `cid444_agg_big` c WHERE 1";
>>>
>>> startstart=time.time();
>>> cursorconn.execute(sql);
21600L #returned 21600 records
>>> print time.time()-startstart, "for execute()"
2.86254501343 for execute() #why does this take so long?
>>>
>>> startstart=time.time();
>>> rows = cursorconn.fetchall()
>>> print time.time()-startstart, "for fetchall()"
0.0021288394928 for fetchall() #this is very fast, no problem with fetchall()
在mysql shell中运行此查询,产生0.27秒,或者快10倍!!!
我唯一想到的是返回数据的大小。这将返回21600“宽”行。所以很多数据都被发送到python。数据库是localhost,因此没有网络延迟。
为什么这需要这么长时间?
更新更多信息
我在php中写了一个类似的脚本:
$c = mysql_connect ( 'localhost', '*****', '****', true );
mysql_select_db ( 'cachedata', $c );
$time_start = microtime_float();
$sql="SELECT * FROM `cid444_agg_big` c WHERE 1";
$q=mysql_query($sql);$c=0;
while($r=mysql_fetch_array($q))
$c++;//do something?
echo "Did ".$c." loops in ".(microtime_float() - $time_start)." seconds\n";
function microtime_float(){//function taken from php.net
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
打印:
Did 21600 loops in 0.56120800971985 seconds
这会循环播放所有数据,而不是一次性全部检索。 PHP似乎比python版本 6倍 ....
答案 0 :(得分:2)
The default MySQLdb cursor在execute
上将完整的结果集提取到客户端,而fetchall()
只会将数据从内存中复制到内存中。
如果要将结果集存储在服务器上并按需获取,则应使用SSCursor代替。
Cursor:
这是标准的Cursor类,它将行作为元组返回,并将结果集存储在客户端中。SSCursor:
这是一个Cursor类,它将行作为元组返回,并将结果集存储在服务器中。