2015-11-14 29 views
4

我使用python-mysql的(MySQLdb的)来查询MySQL服务器。 有两个光标模块:一个是客户端游标,如:我感到困惑MySQLdb的服务器端游标和客户端游标

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

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

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

的医生说服务器端游标意味着Mysql的将缓存一些结果在MySQL服务器端,然后将它们发送到客户端。我对此很困惑,比方说,如果我想杀死一个mysql服务器,我可以使用多个服务器端游标,然后由于内存耗尽,mysql将会死机。而且,服务器大小的光标有什么意义?默认情况下,Mysql机制是当mysql检索到一条记录时,它会立即将它发送出客户端。缓存结果然后发送出去会有意义吗?

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

+1

不是一个答案,因为我将这个基于另一个相同的数据库管理系统....有些情况下,你是逐页显示结果,即使有(说)10页,因为他们的方式排序后,用户往往只看第1个。所以,为什么要发送全部10个网页。 –

+0

问题是如果你需要1,你为什么要查询10页。这是可怕的设计。 – nimdil

回答

1

我不是最大的数据库忍者左右,但很多时候事情被内置到服务器软件,它不是一般的或常见的情况真的很有用,但说真的,在一个小角落的情况下真正真棒。

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

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

此人声称,SScursor更多的是一个 “缓冲” 光标。

这种似乎矛盾的是:

http://dev.mysql.com/doc/refman/5.7/en/cursor-restrictions.html

无论如何,那种似乎对服务器端游标的使用是当你处理的数据集,使得您的查询可以压倒客户端。

+0

你说链接#2似乎与链接#1相矛盾,但他们谈论的是不同的事情。 #1正在谈论Python库中的“服务器端游标”SSCursor,确实名称不正确。当它从服务器获取行时,它只调用mysql_use_result()而不是mysql_store_result()。您可以在这里阅读更多关于这些内容的信息:https://dev.mysql.com/doc/refman/5.7/en/mysql-use-result.html #2正在讨论不同的服务器端结果集功能,在服务器本身中实现。 –

1

我相信MySQL的宁可错杀,因为很少超大光标光标不是崩溃。

你能想到的几种情况时,服务器端游标是有道理的。例如,如果网络连接速度较慢并且光标较大,则可以在一小部分数据上工作,可以更快速地将其传递到其他系统,然后再获取更多数据。这样解决方案的整体速度会更快。

其他我可以想到的情况是,当你有非常强大的数据库服务器,并且在客户端下面是蹩脚的机器时 - 这种情况下,对于大数据集,数据库容易保存整个集合给客户端,客户可以高效地微观管理内存。

有可能许多其他方案。如果你认为它没有意义,就不要使用它。并非所有选项都适用于每个设置。

1

光标由出三个部分组成:

  • 查询
  • 查询结果
  • 的指针的地方,直到其中的数据已被检索。

根据查询,其结果可以被缓存,或由发动机中的部件被检索:

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

SELECT * FROM sometable; 

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

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

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

在这种情况下的MySQL(和同样最其他DBMS)必须首先得到正确的顺序中的所有数据。为此,临时表将在#tmp位置的磁盘上创建。这可能会导致磁盘已满(大多数时间会将其转换为out of memory错误)并导致连接中断。但MySQL仍然在运行。