大家好,我是阿飞云
怕什么真理无穷,进一步有近一步的欢喜
记录一个MySQL查询排序的问题,一个SQL语句没有加orderby,那么查询出来的结果到底是按照什么规则排序的呢?查询了网上的一些资料,分享如下:
?MyISAM表
MySQLSelect默认排序是按照物理存储顺序显示的(不进行额外排序)。也就是说SELECT*FROMtbl–会产生“表扫描”。如果表没有删除、替换、更新操作,记录会显示为插入的顺序。
?InnoDB表
同样的情况,会按主键的顺序排列,需要再次强调,这只是潜规则,实际也不一定完全靠谱的。
参考:MySQL也有潜规则–Select语句不加orderby如何排序?[1]
如果没有定义orderby:
那返回的数据不一定是按照主键来排序的,结果可以以任意顺序返回-也可能随着时间而改变。
在关系数据库中没有“自然顺序”或类似的东西(至少在我所知道的情况下)。获得可靠排序的唯一方法是显式指定orderby子句,来源when-no-order-by-is-specified-what-order-does-a-query-choose-for-your-record[2]。
对于同样的一批数据,在某一个时刻顺序是一样的,随着时间变化,数据会发生变化,那么在进行查询的时候,MySQL会尝试以尽可能快的方法(MySQL实际的方法不见得快)返回数据。
由于访问主键、索引大多数情况会快一些(在Cache里)所以返回的数据有可能以主键、索引的顺序输出,这里并不会真的进行排序,主要是由于主键、索引本身就是排序放到内存的,所以连续输出时可能是某种序列。在一些情况下消耗硬盘寻道时间最短的数据会先返回。如果只查询单个表,在特殊的情况下是有规律的。
下面的内容分析来源:what-is-the-default-order-of-records-for-a-select-statement-in-mysql[3]
MySQL中SELECT语句的默认记录顺序是什么?
里面有一个认可和点赞比较高的回答:
大致解读一下回答的内容,重新发布一下之前回答过的一个SQLServer类型的问题。
在SQL世界中,顺序不是一组数据的固有属性。因此,除非您使用orderby子句查询您的数据,否则您无法从RDBMS保证您的数据将按特定顺序返回-甚至以一致的顺序返回。
然后回答你的问题:
?MySQL根据需要对记录进行排序,但没有任何一致性保证?如果您打算依赖此顺序进行任何操作,则必须使用orderby指定您想要的顺序。否则做任何其他事情都是在为不受欢迎的意外做好准备。
这是所有SQL的属性,而不仅仅是MySQL。SQL-92规范中的相关文本是: