假设您具有以下表和数据:

create table t (
    k int,
    v int,
    index k(k)
    ) engine=memory;

insert into t (k, v)
values (10, 1),
       (10, 2),
       (10, 3);


发出不带select * from t where k = 10子句的order by时,MySQL如何默认对记录进行排序?

#1 楼

重新回答有关SQL Server的类似问题的答案:


在SQL世界中,顺序不是一组数据的固有属性。
因此,您无法保证从RDBMS中,您的数据将以特定顺序返回-甚至以一致的顺序返回-除非您
使用ORDER BY子句查询数据。


因此,回答您的问题:


MySQL对记录进行排序,但是它不需要任何保证。
如果您打算依靠此顺序执行任何操作,您必须使用ORDER BY指定所需的订单。做其他事情就是使自己适应不受欢迎的意外。


这是所有SQL的属性,而不仅仅是MySQL。 SQL-92规范中的相关文本为:




如果未指定,则Q行的排序与实现有关。


游标规范中有相似的文字。

#2 楼

在没有ORDER BY子句的情况下,行的顺序可能是:


任意两个存储引擎之间的差异;
如果使用相同的存储引擎,则它们之间可能会有所不同同一存储引擎的任何两个版本;此处的示例向下滚动到“行的排序”。
如果存储引擎版本相同,但是MySQL版本不同,则可能由于查询优化器在这些版本之间的更改而有所不同;
如果一切都是一样的,由于月相的关系,可能会有所不同。


#3 楼

到达时插入无序,混乱。创建的索引确实具有顺序,其中元素被插入到作为索引的链表中的正确位置。考虑一个索引的三重链表,其中有一个从一个索引元素到下一个索引元素的前向链接,一个用于遍历和完整性目的的向后链接,然后是指向表中实际记录的一组指针,其中匹配有问题的索引元素。

实际数据,存储混乱。与数据关联的索引,在存储和构造中排序。数据的实际拉取(有序或无序)取决于所涉及的查询。