我在我的应用程序中发现execute()
了 mysql 功能的缓慢。我制作了一个简单的 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。数据库是本地主机,因此没有网络延迟。
为什么这需要这么长时间?
更新更多信息
我在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 倍....