我对 MySQLdb 服务器端游标和客户端游标感到困惑
I'm confused about MySQLdb server side cursor and client cursor
我正在使用 python-mysql(MySQLdb) 查询 Mysql 服务器。
游标模块有两种:一种是客户端游标,如:
cursor = db.cursor(MySQLdb.cursors.DictCursor)
另一种是服务端游标,如:
cursor = db.cursor(MySQLdb.cursors.SSDictCursor)
文档说服务器端游标意味着 Mysql 会在 mysql 服务器端缓存一些结果,然后将它们发送到客户端。我对此很困惑,比方说,如果我想杀死一个 mysql 服务器,我可以只使用多个服务器端游标,然后 mysql 会因为内存 运行 耗尽而死掉。此外,服务器大小光标是否有意义?默认的Mysql机制是,当mysql检索到一条记录时,它会立即将它发送给客户端。缓存结果然后将它们发送出去是否有意义?
我真的不知道应该使用哪个游标,客户端游标还是服务器端游标?
我相信 MySQL 宁愿杀死你的光标也不愿因为几个超大光标而崩溃。
当服务器端游标有意义时,您可以想到几种情况。例如,如果您的网络连接速度较慢并且光标很大,您可以处理一小部分数据,这样您可以获得更快的数据,可能会将其传递给其他系统,然后再获取更多数据。这样整体求解速度会更快
我能想到的其他情况是,当您拥有非常强大的数据库服务器,而客户端下的机器相当糟糕时 - 这样在大数据集的情况下,数据库会更容易为您的客户端保存整个集合,同时客户端可以有效地微管理内存。
可能还有很多其他的场景。如果您认为它没有意义,请不要使用它。并非所有选项都适用于每个设置。
我不是周围最伟大的数据库忍者,但通常情况下,服务器软件中内置的东西在一般或常见情况下并不是很有用,但在那个小角落情况下真的非常棒。
Nimdil 给了你一个,但这是另一个:
http://techualization.blogspot.com/2011/12/retrieving-million-of-rows-from-mysql.html
此人断言 SScursor 更像是一个 "unbuffered" 游标。
这似乎与此矛盾:
http://dev.mysql.com/doc/refman/5.7/en/cursor-restrictions.html
无论如何,服务器端游标的使用似乎是在您处理数据集时,这样您的查询可能会使客户端不堪重负。
游标由三部分组成:
- 一个查询
- 一条查询结果
- 指向数据检索位置的指针。
根据查询,结果可以缓存,也可以由引擎部分检索:
例如通常不缓存的查询结果:
SELECT * FROM sometable;
每次您请求一行时,MySQL(和大多数其他 DBMS)只会从 table 中检索一行。但是,如果您以读取提交的方式使用 InnoDB 和 ACID 兼容事务,它可以使用 table 锁。
第二种情况是必须缓存结果的查询:
SELECT * FROM sometable ORDER BY a,b,c;
在这种情况下,MySQL(以及大多数其他 DBMS)必须首先以正确的顺序获取所有数据。为此,将在磁盘上的#tmp 位置创建临时 table。这可能会导致磁盘已满(大部分时间翻译为 out of memory
错误)问题和连接丢失。 MySQL 但是保持 运行.
我正在使用 python-mysql(MySQLdb) 查询 Mysql 服务器。 游标模块有两种:一种是客户端游标,如:
cursor = db.cursor(MySQLdb.cursors.DictCursor)
另一种是服务端游标,如:
cursor = db.cursor(MySQLdb.cursors.SSDictCursor)
文档说服务器端游标意味着 Mysql 会在 mysql 服务器端缓存一些结果,然后将它们发送到客户端。我对此很困惑,比方说,如果我想杀死一个 mysql 服务器,我可以只使用多个服务器端游标,然后 mysql 会因为内存 运行 耗尽而死掉。此外,服务器大小光标是否有意义?默认的Mysql机制是,当mysql检索到一条记录时,它会立即将它发送给客户端。缓存结果然后将它们发送出去是否有意义?
我真的不知道应该使用哪个游标,客户端游标还是服务器端游标?
我相信 MySQL 宁愿杀死你的光标也不愿因为几个超大光标而崩溃。
当服务器端游标有意义时,您可以想到几种情况。例如,如果您的网络连接速度较慢并且光标很大,您可以处理一小部分数据,这样您可以获得更快的数据,可能会将其传递给其他系统,然后再获取更多数据。这样整体求解速度会更快
我能想到的其他情况是,当您拥有非常强大的数据库服务器,而客户端下的机器相当糟糕时 - 这样在大数据集的情况下,数据库会更容易为您的客户端保存整个集合,同时客户端可以有效地微管理内存。
可能还有很多其他的场景。如果您认为它没有意义,请不要使用它。并非所有选项都适用于每个设置。
我不是周围最伟大的数据库忍者,但通常情况下,服务器软件中内置的东西在一般或常见情况下并不是很有用,但在那个小角落情况下真的非常棒。
Nimdil 给了你一个,但这是另一个:
http://techualization.blogspot.com/2011/12/retrieving-million-of-rows-from-mysql.html
此人断言 SScursor 更像是一个 "unbuffered" 游标。
这似乎与此矛盾:
http://dev.mysql.com/doc/refman/5.7/en/cursor-restrictions.html
无论如何,服务器端游标的使用似乎是在您处理数据集时,这样您的查询可能会使客户端不堪重负。
游标由三部分组成:
- 一个查询
- 一条查询结果
- 指向数据检索位置的指针。
根据查询,结果可以缓存,也可以由引擎部分检索:
例如通常不缓存的查询结果:
SELECT * FROM sometable;
每次您请求一行时,MySQL(和大多数其他 DBMS)只会从 table 中检索一行。但是,如果您以读取提交的方式使用 InnoDB 和 ACID 兼容事务,它可以使用 table 锁。
第二种情况是必须缓存结果的查询:
SELECT * FROM sometable ORDER BY a,b,c;
在这种情况下,MySQL(以及大多数其他 DBMS)必须首先以正确的顺序获取所有数据。为此,将在磁盘上的#tmp 位置创建临时 table。这可能会导致磁盘已满(大部分时间翻译为 out of memory
错误)问题和连接丢失。 MySQL 但是保持 运行.