1

从应用程序中逐行读取 MySQL 表时,是否可以安全地假设该表将始终以完美的顺序从上到下依次读取。

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

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

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

谢谢 C

4

3 回答 3

2

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

SELECT columns
FROM tables
WHERE predicates
ORDER BY column ASC/DESC;
于 2011-11-10T10:04:37.653 回答
1

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

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

于 2011-11-10T10:18:18.973 回答
0

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

在任何 RDBMS 上都不能保证这一点。没有人应该依赖这一假设。

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

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

SELECT columns
FROM table

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

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

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

ORDER BY结论是,如果您想保证每次都相同的顺序,您应该参与查询。

于 2011-11-10T10:31:17.950 回答