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规范中的相关文本为:
如果未指定
游标规范中有相似的文字。
#2 楼
在没有ORDER BY
子句的情况下,行的顺序可能是:任意两个存储引擎之间的差异;
如果使用相同的存储引擎,则它们之间可能会有所不同同一存储引擎的任何两个版本;此处的示例向下滚动到“行的排序”。
如果存储引擎版本相同,但是MySQL版本不同,则可能由于查询优化器在这些版本之间的更改而有所不同;
如果一切都是一样的,由于月相的关系,可能会有所不同。
#3 楼
到达时插入无序,混乱。创建的索引确实具有顺序,其中元素被插入到作为索引的链表中的正确位置。考虑一个索引的三重链表,其中有一个从一个索引元素到下一个索引元素的前向链接,一个用于遍历和完整性目的的向后链接,然后是指向表中实际记录的一组指针,其中匹配有问题的索引元素。实际数据,存储混乱。与数据关联的索引,在存储和构造中排序。数据的实际拉取(有序或无序)取决于所涉及的查询。