MySQL 中 SELECT 语句的默认记录顺序是什么?

dai*_*isy 94 mysql mysql-5 index order-by select

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

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

insert into t (k, v)
values (10, 1),
       (10, 2),
       (10, 3);
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*mas 108

重新发布对有关 SQL Server 的类似问题的回答

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

所以,回答你的问题:

  • MySQL 根据需要对记录进行排序,但不保证一致性。
  • 如果您打算依赖此顺序进行任何操作,则必须使用 指定所需的顺序ORDER BY。做任何其他事情都是在为不受欢迎的惊喜做好准备。

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

如果未指定 <order by 子句>,则 Q 的行的顺序取决于实现。

游标规范中有类似的文本位。


Lau*_*nis 36

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

  • 任意两个存储引擎之间不同;
  • 如果使用同一个存储引擎,同一个存储引擎的任意两个版本之间可能会有所不同;例如,向下滚动到“行排序”。
  • 如果存储引擎版本相同,而MySQL版本不同,则可能是由于这些版本之间查询优化器的变化而不同;
  • 如果一切都相同,则可能会因月相而有所不同,这没关系。

  • 月相确实会影响 SQL 属性。否则,我们如何解释我的查询在几分钟前有效,但现在我的项目经理正在查看它,但它不起作用这一事实? (3认同)

小智 12

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

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