6

示例场景:

MySQL 运行单个服务器 -> HOSTNAME

该服务器上的两个 MySQL 数据库 -> USERS , GAMES 。

任务 -> 从 GAMES.my_games_table 获取 10 个最新游戏,并从 USERS.my_users_table 获取玩这些游戏的用户(假设没有加入)

在 Django 和 Python MySQLdb 中,为什么每个数据库都有一个游标更可取?

每个 MySQL 服务器单个的扩展游标的缺点是什么,并且可以切换数据库(例如通过查询“use USERS;”),然后在相应的数据库上工作

MySQL 连接很便宜,但如果存在线性流并且没有可能需要两个游标的复杂事务,那么单个连接是否比许多连接更好?

4

3 回答 3

10

更简短的回答是“MySQL 不支持那种类型的游标”,Python-MySQL 也不支持,所以首选连接命令的原因是因为 MySQL 就是这样工作的。这是一种重言式。

然而,更长的答案是:

  1. 根据您的定义,“游标”是访问 RDMS 中的表和索引的某种类型的对象,能够维护其状态。
  2. 根据您的定义,“连接”将接受命令,并分配或重用游标来执行命令的操作,将其结果返回给连接。
  3. 根据您的定义,“连接”将/可以管理多个游标。
  4. 您认为这将是访问数据库的首选/高性能方式,因为“连接”很昂贵,而“游标”很便宜。

然而:

  1. MySQL(和其他 RDMS)中的Acursor不是用于执行操作的用户可访问机制。MySQL(和其他的)以“set”的形式执行操作,或者更确切地说,它们将您的 SQL 命令编译为内部命令列表,并根据您的 SQL 命令的性质和表结构执行大量复杂的位。
  2. Acursor是一种特定机制,在存储过程中使用(并且仅在存储过程中使用),为开发人员提供了一种以过程方式处理数据的方法。
  3. MySQL 中的“连接”就是您所认为的“光标”。MySQL 不会将它的内部结构作为迭代器或指针公开给您,它只是在表上移动。它将其内部暴露为“连接”,接受 SQL 和其他命令,将这些命令转换为内部操作,执行该操作,并将结果返回给您。
  4. 这是“集合”和“程序”执行风格之间的区别(这实际上是关于您(用户)被授予访问权限的控制粒度,或者至少是 RDMS 如何抽象其内部的固有粒度当它通过 API 公开它们时)。
于 2013-03-10T22:54:16.063 回答
2

正如您所说,MySQL 连接很便宜,因此对于您的情况,我不确定在代码组织和流程之外,无论哪种方式都有技术优势。管理两个游标可能比通过煞费苦心地跟踪 SQL 'USE' 语句来跟踪单个游标当前正在与哪个数据库通信更容易。使用其他数据库的里程可能会有所不同——请记住,Django 力求与数据库无关。

此外,考虑两个不同的数据库,即使在同一台服务器上,也需要不同的访问凭据的情况。在这种情况下,将需要两个连接,以便每个连接都可以成功进行身份验证。

于 2013-03-08T19:56:55.390 回答
0

每个数据库一个游标不一定是可取的,它只是默认行为。

基本原理是不同的数据库通常位于不同的服务器上,使用不同的引擎,和/或需要不同的初始化选项。(否则,你为什么要首先使用不同的“数据库”?)

在您的情况下,如果您的两个数据库只是表的名称空间(在 SQL 术语中应该称为“模式”)但驻留在同一个 MySQL 实例上,那么一定要使用单个连接。(如何配置 Django 这样做实际上是一个完全不同的问题。)

如果您只有一个线程并且实际上并不同时需要两个数据库工作人员,那么单个连接优于两个连接也是对的。

于 2013-03-14T22:15:29.047 回答