我一直在努力加速我现在使用大约一周的查询,并在这里询问了几个问题(如何在运行sqlite查询后加快获取结果?,sqlite.fetchall()是否正常是如此之慢?,如何以有效的方式使用min()和max()?).
从那里给出的答案非常有用的帮助下,我设法让时间缩短到sqlite的查询到100.95秒,使用fetchall服用:1485.43.这仍然是不够的,所以在尝试了一些不同的索引后,我设法将查询时间缩短到0.08一个样本的秒数,并将获取时间缩短到54.97几秒钟.所以我觉得我终于设法加快了速度.
然后查询运行下一个样本,花费0.58几秒钟,并且fetchall花费3952.80几秒钟.对于第三个样本,查询花了1.01几秒钟,花了1970.67几秒钟来取消.
第一个样本获取12951行,第二个样本获取24972行,第三个6470行.我很好奇为什么第一个样本获取行的速度要快得多,因为它只有大约一半的量来获取第二个例子.
代码(spectrumFeature_inputValues是(1,),(2,)和(3,),来自使用的3个样本.):
self.cursor.execute('begin')
self.cursor.execute("EXPLAIN QUERY PLAN "+
"SELECT precursor_id, feature_table_id "+
"FROM `MSMS_precursor` "+
"INNER JOIN `spectrum` ON spectrum.spectrum_id = MSMS_precursor.spectrum_spectrum_id "+
"INNER JOIN `feature` ON feature.msrun_msrun_id = spectrum.msrun_msrun_id "+
"WHERE spectrum.scan_start_time BETWEEN feature.rtMin AND feature.rtMax "+
"AND MSMS_precursor.ion_mz BETWEEN feature.mzMin AND feature.mzMax "+
"AND feature.msrun_msrun_id = ?", spectrumFeature_InputValues)
print 'EXPLAIN QUERY PLAN: …Run Code Online (Sandbox Code Playgroud) 想象一下,我有一个mysql游标和数据读取.数据量可能非常大,我想每次处理一行.
一个简单直接的方式可能是这样的:
while True:
row = cursor.fetchone()
if not row: break
.....
Run Code Online (Sandbox Code Playgroud)
但这看起来不太好,所以我想知道这种方式是否像想象的那样有效:
for row in iter(cursor.fetchall())
Run Code Online (Sandbox Code Playgroud)
我想知道的是:如果我使用这种iter(cursor.fetchall())方式,它是先获取所有数据还是一次只取一行?
任何想法都表示赞赏.
谢谢
我在Ubuntu 10.04中遇到PHP问题.当我尝试使用mysqli_result :: fetch_all时出现此错误:
调用未定义的方法mysqli_result :: fetch_all()
但是,它适用于Windows XP.
代码:
$result = $this->dbh->query('SELECT [...] ');
return $result->fetch_all(MYSQLI_ASSOC);
Run Code Online (Sandbox Code Playgroud)
我不想在循环中使用fetch_assoc,因为我将结果发送到另一个层进行处理.
我使用的是PHP 5.4.4.和php -m | grep mysql mysqlnd模块它没有出现.我该如何安装?这可能是问题吗?
我在python中使用psycopg2模块从postgres数据库中读取,我需要对列中的所有行进行一些操作,该行有超过100万行.
我想知道会cur.fetchall()失败或导致我的服务器出现故障?(因为我的RAM可能不会那么大,无法保存所有数据)
q="SELECT names from myTable;"
cur.execute(q)
rows=cur.fetchall()
for row in rows:
doSomething(row)
Run Code Online (Sandbox Code Playgroud)
更聪明的方法是什么?
我无法从fetchAll获取数据以便有选择地进行打印.
在普通的mysql中我这样做:
$rs = mysql_query($sql);
while ($row = mysql_fetch_array($rs)){
$id = $row['id'];
$n = $row['n'];
$k = $row['k'];
}
Run Code Online (Sandbox Code Playgroud)
在PDO中,我遇到了麻烦.我绑定了params,然后我将获取的数据保存到$ rs中,就像上面一样,目的是以相同的方式循环它.
$sth->execute();
$rs = $query->fetchAll();
Run Code Online (Sandbox Code Playgroud)
麻烦的部分来了.我该怎么做PDO-wise来获得与上面的while循环相匹配的东西?!我知道我可以使用print_r()或dump_var,但这不是我想要的.我需要做我以前能用普通mysql做的事情,比如根据需要单独抓取$ id,$ n,$ k.可能吗?
提前致谢..
使用带有pdo的预准备语句时,关闭仿真是否有任何副作用?我正在使用select*并限制需要作为int而不是字符串处理的结果.我可以做两件事之一.
$conn->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
Run Code Online (Sandbox Code Playgroud)
或者使用param类型显式绑定这些变量:
$stm = $pdo->prepare('SELECT * FROM table LIMIT ?, ?');
$stm->bindParam(1, $limit_from,PDO::PARAM_INT);
$stm->bindParam(2, $per_page,PDO::PARAM_INT);
$stm->execute();
$data = $stm->fetchAll();
Run Code Online (Sandbox Code Playgroud)
任何利弊?显然,关闭仿真可以节省很多绑定.
我可以覆盖模型中的fetchall方法吗?每次调用fetchAll时我都需要检查.该模型扩展了Zend_db_table_abstract
我正在尝试在具有2个变量的查询上使用fetchAll.我无法弄清楚语法.我只能管理1个变量:
$sql = "SELECT * FROM mytable WHERE field1 = ?";
$this->_db->fetchAll($sql,$value1); # that works
Run Code Online (Sandbox Code Playgroud)
但是,当查询有多个变量时,我遇到了一些问题
$sql = "SELECT * FROM mytable WHERE field1 = ? AND field2 = ?";
$this->_db->fetchAll($sql,$value1,$value2); # doesn't work
$this->_db->fetchAll($sql,array("field1"=>$value1,"field2"=>$value2)); # doesn't work either
Run Code Online (Sandbox Code Playgroud)
我之所以要用?而不是将变量直接放入查询是我已经学会了使用?允许查询由db引擎一般编译并提高性能.
我想知道我是否做得很好或者fetchAll()不适用于WHILE.
这是一个例子
$db=new PDO("mysql:host=" .$dbhost. "; dbname=" . $dbname, $dbuser, $dbpass);
$page=$db->prepare("SELECT * FROM page");
$page->execute();
foreach ($page->fetchAll(PDO::FETCH_ASSOC) as $row) {
//echo a row
//is working
}
Run Code Online (Sandbox Code Playgroud)
但是,如果尝试循环一段时间我
while ($row=$page->fetchAll(PDO::FETCH_ASSOC)){
//echo a row
//Show empty
}
Run Code Online (Sandbox Code Playgroud)
我试图只使用fetch(),它正在工作,我的问题:为什么fetchAll()不能用于"WHILE"?
我有一个奇怪的问题,我不太确定如何解决它搜索谷歌/ SO后发现没什么相似的.
当我试图从光标中获取查询结果时,它会给我一个元组元组,除了元组是字符串?下面是代码.
def queryFeeds(db):
sql = """SELECT ngo.n_id, feeds.url FROM ngo
JOIN feeds ON ngo.n_id = feeds.n_id;"""
db.c.execute(sql)
feeds = db.c.fetchall()
return feeds
Run Code Online (Sandbox Code Playgroud)
此处的打印输出是函数返回的feeds变量:
feeds[0]
('(277,http://resultsuk.wordpress.com/feed)',)
feeds[0][0]
'(277,http://resultsuk.wordpress.com/feed)'
type(feeds[0][0])
<type 'str'>
feeds[0][0][0:10]
'(277,http:'
Run Code Online (Sandbox Code Playgroud)
db只是一个具有数据库连接的类,其中db.c是游标.提前致谢.删除的数据是http://链接,因为我的声誉很低,所以我不会发布这些链接.
干杯,
卢卡斯
fetchall ×10
php ×5
python ×3
mysql ×2
pdo ×2
postgresql ×2
cursor ×1
database ×1
foreach ×1
model ×1
mysqli ×1
mysqlnd ×1
overriding ×1
performance ×1
psycopg2 ×1
sqlite ×1
while-loop ×1
zend-db ×1