相关疑难解决方法(0)

如何有效地使用MySQLDB SScursor?

我必须处理一个大的结果集(可能是数十万行,有时更多).
不幸的是,它们需要一次性检索(启动时).

我试图通过使用尽可能少的内存来做到这一点.
通过查看,我发现使用SSCursor可能是我正在寻找的,但我仍然不知道如何正确使用它们.

fetchall()从基本游标或SScursor 做一个相同的(在内存使用方面)?
我可以从sscursor我的行逐个"流动"(或几个),如果是,
那么最好的方法是什么?

python mysql optimization cursor

31
推荐指数
2
解决办法
2万
查看次数

了解MySQL游标类型

MySQL版本:5.5.37-0ubuntu0.14.04.1

我目前正在编写一个python脚本,它利用大量的MySQL表和查询来获取存储在表中的倒排索引的结果.

我注意到,在执行查询时选择合适的类型光标的MySQLdb的Python模块中有一个真正对性能影响较大,想知道是否有人能解释或提供了可靠的资源解释其光标时使用.

例如,使用SSCursor执行此查询40次需要7秒:

SELECT Pages.PageID,
       Pages.PageName,
       Counter AS TermFreq,
       Pages.Length,
       (Counter / LOG(Length)) AS Weight
FROM Pages
INNER JOIN TermOccurrences ON TermOccurrences.PageID = Pages.PageID
INNER JOIN Terms ON TermOccurrences.TermID = Terms.TermID
WHERE TermName = %s
ORDER BY Weight DESC
LIMIT 20;
Run Code Online (Sandbox Code Playgroud)

使用默认Cursor运行相同的查询40次需要0.004秒.

删除权重计算(计数器/ LOG(长度))使得此查询使用SSCursor再次快速执行.

我正在使用SSCursor,因为它证明在许多其他查询上具有非常优越的性能,然后突然变得非常慢.当它执行得如此之快时,更改回默认的Cursor让我感到惊讶.

编辑:更多的例子.

使用默认光标运行以下40次需要~3秒:

SELECT COUNT(*)
FROM Pages
INNER JOIN TermOccurrences ON TermOccurrences.PageID = Pages.PageID
INNER JOIN Terms ON TermOccurrences.TermID = Terms.TermID
WHERE TermName = %s AND Counter > 2
Run Code Online (Sandbox Code Playgroud)

使用SSCursor运行它大约需要0.002秒.

python mysql sql

15
推荐指数
1
解决办法
952
查看次数

标签 统计

mysql ×2

python ×2

cursor ×1

optimization ×1

sql ×1