【问题标题】:MySQL table read order reliabilityMySQL 表读取顺序可靠性
【发布时间】:2011-12-26 00:55:12
【问题描述】:

当从应用程序中逐行读取 MySQL 表时,假设该表总是从上到下,一个接一个地以完美的顺序读取,是否安全。

例如如果一个表按唯一 ID 排序,并且我通过 C++ 一次读取一行。假设我每次都会以完全唯一的 ID 顺序获取每一行是否安全。

我的直觉是,这不是一个安全的假设,但我没有技术上的理由。

我的测试始终表明它确实按顺序提供了表格行,但依赖它让我感到紧张。因此,我编写的程序不依赖于这种假设,这使它们变得更复杂,效率也更低。

谢谢 C

【问题讨论】:

  • 我认为这正是ORDER BY 应该实现的目标。 oO
  • 你用什么库来连接 MySQL 数据库?
  • 标准(我认为)C++ 连接器。

标签: mysql reliability


【解决方案1】:

你是对的。 假设在从应用程序中逐行读取 MySQL 表时,该表将始终以完美的顺序从上到下依次读取。 假设是不安全的,如果一个表是按唯一 ID 排序的,并且我一次读取(通过 C++ 或其他方式)一行,那么您将得到每一行的唯一 ID 顺序每次。

在任何 RDBMS 上都无法保证这一点。任何人都不应依赖这一假设。

行在关系表中没有(阅读:不应该有)内在或默认顺序。根据定义,表(关系)是无序的集合或行。

给人的印象是,大多数系统在被要求返回如下查询的结果时:

SELECT columns
FROM table

他们从磁盘检索所有行,读取整个文件。因此,它们(通常)按照它们在文件中存储的顺序或聚集键的顺序(例如在 MySQL 中的 InnoDB 表中)返回行。因此,它们每次都以相同的顺序返回结果。

如果FROM子句中有多个表,或者如果有WHERE条件,情况就完全不同了,因为没有读取整个表,可能使用了不同的索引,所以系统可能无法读取表文件,但只是索引文件。或者阅读表格的一小部分。

如果您有分区表或分布式数据库,这也是另一回事。

结论是,如果您想保证每次都相同的顺序,您应该在查询中包含ORDER BY 部分。

【讨论】:

    【解决方案2】:

    如果您使用的是标准 C++ MySQL 连接器,那么根据reference manual,“预览版确实会缓冲客户端上的所有结果集以支持游标”。

    根据我的经验,您的结果集通常是缓冲的,因此当基础表更改时不会更改。

    【讨论】:

      【解决方案3】:

      如果您使用以下查询,您应该没有问题,

      SELECT columns
      FROM tables
      WHERE predicates
      ORDER BY column ASC/DESC;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-09
        • 1970-01-01
        • 2013-04-15
        • 1970-01-01
        • 2012-12-15
        • 1970-01-01
        • 1970-01-01
        • 2011-09-04
        相关资源
        最近更新 更多