MySQL表读取顺序可靠性

时间:2011-11-10 10:01:54

标签: mysql reliability

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

E.G。如果表是按唯一ID排序的,我一次只能通过C ++读取一行。假设我每次都会以精确唯一的ID顺序获得每一行,这是否安全。

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

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

由于 ç

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

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

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

SELECT columns
FROM table

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

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

如果您有分区表或分布式数据库,这也是一个不同的故事。

结论是,如果您希望每次都保证相同的订单,那么您的查询中应该有ORDER BY部分。