我正在使用python-mysql(MySQLdb)来查询Mysql服务器。 有两个游标模块:一个是客户端游标,例如:
cursor = db.cursor(MySQLdb.cursors.DictCursor)
另一个是服务器端游标,例如:
cursor = db.cursor(MySQLdb.cursors.SSDictCursor)
文档说服务器端游标意味着Mysql会在mysql服务器端缓存一些结果,然后将它们发送到客户端。我对此非常困惑,让我们说,如果我想杀死一个mysql服务器,我可以使用多个服务器端游标,然后mysql将因内存耗尽而死亡。此外,服务器大小光标是否有意义?默认情况下,Mysql机制是当mysql检索到一条记录时,它会立即将它发送出客户端。有意义的是缓存结果然后发送出来吗?
我真的不知道我应该使用哪个游标,客户端游标或服务器端游标?
答案 0 :(得分:1)
我不是最好的数据库忍者,但通常情况下内置于服务器软件中,这些软件在一般情况下或普通情况下都不是很有用,但在一个小角落里真的很棒案件。
Nimdil给了你一个,但这是另一个:
这个人断言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一直在运行。