MySQL 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值