我对MySQLdb服务器端游标和客户端游标

时间:2015-11-14 01:53:05

标签: mysql cursor mysql-python

我正在使用python-mysql(MySQLdb)来查询Mysql服务器。 有两个游标模块:一个是客户端游标,例如:

cursor = db.cursor(MySQLdb.cursors.DictCursor)

另一个是服务器端游标,例如:

cursor = db.cursor(MySQLdb.cursors.SSDictCursor)

文档说服务器端游标意味着Mysql会在mysql服务器端缓存一些结果,然后将它们发送到客户端。我对此非常困惑,让我们说,如果我想杀死一个mysql服务器,我可以使用多个服务器端游标,然后mysql将因内存耗尽而死亡。此外,服务器大小光标是否有意义?默认情况下,Mysql机制是当mysql检索到一条记录时,它会立即将它发送出客户端。有意义的是缓存结果然后发送出来吗?

我真的不知道我应该使用哪个游标,客户端游标或服务器端游标?

2 个答案:

答案 0 :(得分:1)

我不是最好的数据库忍者,但通常情况下内置于服务器软件中,这些软件在一般情况下或普通情况下都不是很有用,但在一个小角落里真的很棒案件。

Nimdil给了你一个,但这是另一个:

verbatim string literals

这个人断言SScursor更像是一个"无缓冲的"光标。

这种情况似乎与此相矛盾:

http://techualization.blogspot.com/2011/12/retrieving-million-of-rows-from-mysql.html

无论如何,似乎服务器端游标的使用是在你处理数据集时,你的查询可能会压倒客户端。

答案 1 :(得分:1)

游标由三部分组成:

  • 查询
  • 查询结果
  • 指向检索数据的地方的指针。

根据查询,结果可以被缓存,也可以由引擎分批检索:

例如,通常不缓存的查询结果:

SELECT * FROM sometable;

MySQL(以及大多数其他DBMS)每次请求行时都会从表中检索一行。但是,如果您使用读取提交样式的InnoDB和ACID兼容事务,它可以使用表锁。

第二种情况是必须缓存结果的查询:

SELECT * FROM sometable ORDER BY a,b,c;

在这种情况下,MySQL(以及大多数其他DBMS)必须首先以正确的顺序获取所有数据。为此,将在#tmp位置的磁盘上创建临时表。这可能导致磁盘已满(大部分时间转换为out of memory错误)问题并导致连接丢失。但是MySQL一直在运行。