天天看点

MySQL record存储顺序与select查询结果顺序背景record在表中的顺序select查询结果顺序

背景

一张表中,同一个键值,有两条相同记录,一条在前,一条在后。利用select语句进行查询并且只取第一条结果时,有时查到的是在前的记录,有时则是在后的记录。

record在表中的顺序

我们不应该希望决定存储记录的物理顺序,原因如下:

1)记录是如何存储的不应该是我们关心的

2)我们应该关心的是记录是如何被展现的

3)由于这个与性能表现相关,所以这个问题应该交给相关领域的专家。

通常比较好的方法是使用自增的列( AUTO_INCREMENT column),并且这列应该被设为主键( primary key),这样查询是就是天然排序的结果。

select查询结果顺序

在SQL中,顺序不是数据(a set of data)的内在属性(inherent)。所以你无法得到从关系型数据库管理系统能获得特定顺序(certain)或一致性顺序(consistent)的数据,除非使用 ORDER BY语句。

相关说明在 SQL-92 如下:

If an <order by clause> is not specified, then the ordering of the rows of Q is implementation-dependent.

对于不用** ORDER BY**,记录返回了与之前记录不一样的实现并不是bug。具体原因没有详细调查,主要在少数MySQL releases上存储引擎(storage engine)和查询优化机制(query optimizer implementation) 会导致查询出现特定的排序。

Reference

[1].https://forums.mysql.com/read.php?10,224469,224483#msg-224483

[2].https://stackoverflow.com/questions/7568535/storing-records-in-mysql-db-in-sorting-order-of-date

[3].https://dba.stackexchange.com/questions/6051/what-is-the-default-order-of-records-for-a-select-statement-in-mysql

sql