省略 Order by 子句的 mysql Innodb 查询的“默认 order by”是什么?

0 mysql innodb sql-order-by

所以我理解并发现帖子表明,当您从 DBMS 检索数据时,不建议在 SQL 查询中省略 order by 子句。

参考的资源和帖子(将更新):

SQL Server UNION - 默认 ORDER BY 行为是什么

如果未指定“排序依据”,查询会为记录集选择什么顺序?

https://dba.stackexchange.com/questions/6051/what-is-the-default-order-of-records-for-a-select-statement-in-mysql

问题 :

如果您想了解更多信息,请参阅下面问题的逻辑。

我的问题是:在带有innoDB引擎的mysql下,有谁知道DBMS如何有效地给我们结果?

我读到它是依赖于实现的,好的,但是有没有办法知道我当前的实现?

这具体是在哪里定义的?

是来自MySQL、InnoDB、操作系统相关吗?

那里没有某种清单吗?

最重要的是,如果我省略 order by 子句并获得结果,我无法确定该代码是否仍适用于较新的数据库版本,并且 DBMS 永远不会给我相同的结果,可以吗?

用例和逻辑:

我目前正在编写一个 CRUD API,并且我的数据库中有一个不包含“id”字段的表(尽管有一个 PK),所以当我在没有任何研究标准的情况下显示该表的结果时,我真的不知道应该用什么来排序结果。我的意思是,我可以使用 PK 或任何从不为空的字段,但这不会使其相关。所以我想知道,因为我的 CRUD 应该适用于任何表,并且我不想通过为这个特定表添加例外来解决这个问题,所以我也可以简单地省略 order by 子句。

最后注意事项:

当我阅读其他帖子、示例和代码示例时,我感觉我想走得太远。据我了解,众所周知,在请求中省略 Order By 子句只是一种不好的做法,并且没有可靠的默认订单子句,并不是说除非您指定,否则根本没有订单。

我只是想知道它是在哪里定义的,并且很想了解它在内部是如何工作的,或者至少是在哪里定义的(DBMS /存储引擎/操作系统相关/其他/多个标准)。我认为了解它并了解这里的内部机制也对其他人有益。

不管怎样,感谢您花时间阅读!祝你今天过得愉快。

Bil*_*win 5

如果没有明确的ORDER BY,当前版本的 InnoDB 将按照其读取索引的顺序返回行。哪个索引各不相同,但它总是从某个索引读取。即使从“表”中读取,实际上也是一个索引\xe2\x80\x94,它是主键索引。

\n\n

正如上面的评论,不能保证这在 InnoDB 的下一版本中保持不变。您应该将其视为巧合行为,它没有记录在案,并且 MySQL 的制造商不承诺不更改它。

\n\n

即使它们的实现没有改变,按索引顺序读取也可能会导致一些您可能意想不到的奇怪效果,并且不会为您提供对您有意义的查询结果集。

\n\n

例如,默认索引是聚集索引 PRIMARY。这意味着索引顺序与主键中值的顺序相同(而不是插入它们的顺序)。

\n\n
mysql> create table mytable ( id int primary key, name varchar(20));\n\nmysql> insert into mytable values (3, \'Hermione\'), (2, \'Ron\'), (1, \'Harry\');\n\nmysql> select * from mytable;\n+----+----------+\n| id | name     |\n+----+----------+\n|  1 | Harry    |\n|  2 | Ron      |\n|  3 | Hermione |\n+----+----------+\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,如果您的查询使用另一个索引来读取表,例如您只访问辅助索引的列,您将按以下顺序获取行:

\n\n
mysql> alter table mytable add key (name);\n\nmysql> select name from mytable;\n+----------+\n| name     |\n+----------+\n| Harry    |\n| Hermione |\n| Ron      |\n+----------+\n
Run Code Online (Sandbox Code Playgroud)\n\n

这表明它正在通过使用二级索引的索引扫描来读取表name

\n\n
mysql> explain select name from mytable;\n+----+-------------+---------+-------+---------------+------+---------+------+------+-------------+\n| id | select_type | table   | type  | possible_keys | key  | key_len | ref  | rows | Extra       |\n+----+-------------+---------+-------+---------------+------+---------+------+------+-------------+\n|  1 | SIMPLE      | mytable | index | NULL          | name | 83      | NULL |    3 | Using index |\n+----+-------------+---------+-------+---------------+------+---------+------+------+-------------+\n
Run Code Online (Sandbox Code Playgroud)\n\n

在更复杂的查询中,预测 InnoDB 将用于给定查询的索引可能会变得非常棘手。随着数据的变化,选择甚至可能每天都在变化。

\n\n

所有这些都表明:ORDER BY如果您关心查询结果集的顺序,您应该只使用它!

\n