2011-11-10 32 views
1

当从表中逐行读取MySQL表时,可以安全地从表中读取数据,该表始终从上到下,以完美的顺序依次读取。MySQL表读取顺序可靠性

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

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

我的测试总是显示它确实提供了表格行,但它让我紧张依赖它。因此,我编写的程序不会依赖于这个假设,这使得它们更复杂一些,效率也稍低。

感谢 Ç

+0

我认为这正是'ORDER BY'应该达到的。 oO – DanielB

+0

您使用什么库连接到MySQL数据库? –

+0

标准(我认为)C++连接器。 – Columbo

回答

1

然后根据reference manual,“预览版本是否缓冲客户端上的所有结果集以支持游标“。

通常我的经验是你的结果集被缓冲了,因此当底层表发生变化时不会改变。

2

如果您如果您使用的是标准的C++的MySQL连接器,使用下面的查询,你应该没有问题,

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

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

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

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

是什么让这个印象是,大多数系统中,当记者问到返回结果的查询,如:

SELECT columns 
FROM table 

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

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

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

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