I';我对MySQLdb服务器端游标和客户端游标感到困惑

I';我对MySQLdb服务器端游标和客户端游标感到困惑,mysql,cursor,mysql-python,Mysql,Cursor,Mysql Python,我正在使用pythonmysql(MySQLdb)查询mysql服务器。 有两个游标模块:一个是客户端游标,如: cursor = db.cursor(MySQLdb.cursors.DictCursor) 另一个是服务器端游标,如: cursor = db.cursor(MySQLdb.cursors.SSDictCursor) 文档说服务器端游标意味着Mysql将在Mysql服务器端缓存一些结果,然后将它们发送到客户端。我对此很困惑,比方说,如果我想杀死一台mysql服务器,我可以使用多

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

cursor = db.cursor(MySQLdb.cursors.DictCursor)
另一个是服务器端游标,如:

cursor = db.cursor(MySQLdb.cursors.SSDictCursor)
文档说服务器端游标意味着Mysql将在Mysql服务器端缓存一些结果,然后将它们发送到客户端。我对此很困惑,比方说,如果我想杀死一台mysql服务器,我可以使用多个服务器端游标,然后mysql就会因为内存耗尽而死亡。此外,服务器大小游标有意义吗?默认情况下,Mysql机制是,当Mysql检索到一条记录时,它会立即将其发送到客户端。缓存结果然后发送出去有意义吗


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

我相信MySQL宁愿杀死你的游标也不愿意崩溃,因为很少有超大型游标

当服务器端游标有意义时,您可以考虑几种场景。例如,如果您的网络连接速度较慢,且光标较大,则可以处理数据的一小部分,这样可以更快地获取数据,也可以将数据传递给其他系统,然后再获取更多数据。这样,解决方案的总体速度会更快

我能想到的另一种情况是,当您的客户机下有非常强大的数据库服务器和相当糟糕的机器时——这样在大数据集的情况下,数据库更容易为您的客户机保存整个数据集,而客户机可以高效地微观管理内存


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

我不是最棒的数据库忍者,但通常情况下,服务器软件内置的东西在一般或普通情况下都不是很有用,但在这一点上却非常棒

尼迪给了你一个,但这是另一个:

此人断言SScursor更像是一个“无缓冲”光标

这似乎与以下观点相矛盾:


无论如何,服务器端游标的使用似乎是在处理数据集时,这样您的查询可能会淹没客户端

光标由三部分组成:

  • 质询
  • 查询结果
  • 指向检索数据之前所在位置的指针
根据查询的不同,引擎可以缓存结果,也可以部分检索结果:

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

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

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

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

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

这不是答案,因为我基于另一个做同样工作的DBMS。。。。在有些情况下,你会一页一页地显示结果,即使有(比如)10页,由于它们的排序方式,用户通常只看前1页。那么,为什么要通过网络发送全部10页呢?问题是,如果需要1页,为什么要查询10页呢。这真是糟糕的设计。你说链接2似乎与链接1相矛盾,但他们谈论的是不同的事情#1是指Python库中的“服务器端游标”SSCursor,它的名称确实有误。当它从服务器获取行时,只调用mysql\u use\u result()而不是mysql\u store\u result()。您可以在这里了解更多内容:#2讨论的是另一种服务器端结果集功能,它是在服务器本身中实现的。