我在 PostgreSQL 文档中读到,如果没有 ORDER 语句,SELECT 将以未指定的顺序返回记录。
最近在一次采访中,有人问我如何按照插入的顺序 SELECT 记录,而无需 PK 或created_at 或其他可用于排序的字段。采访我的高级开发人员坚持认为,如果没有 ORDER 语句,记录将按照插入的顺序返回。
对于 PostgreSQL 来说是这样吗?MySQL 也是如此吗?或者任何其他关系型数据库管理系统?
我可以回答MySQL。我不知道 PostgreSQL 的情况。
通常,默认顺序不是插入顺序。
对于 InnoDB,默认顺序取决于查询读取索引的顺序。您可以从 EXPLAIN 计划中获取此信息。
对于 MyISAM,它按照从表中读取的顺序返回订单。这可能是插入的顺序,但 MyISAM 将在删除记录后重用间隙,因此较新的行可能会更早存储。
这些都没有得到保证;这只是当前实施的副作用。MySQL 可以在下一版本中更改实现,使结果集的默认顺序不同,而不会违反任何记录的行为。
因此,如果您需要按特定顺序排列结果,则应该ORDER BY在查询中使用。
就 PostgreSQL 而言,这是完全错误的。
如果没有删除或更新,行将按照插入顺序存储在表中。尽管顺序扫描通常会按该顺序返回行,但这并不能保证:同步顺序扫描功能可以在已经执行的扫描上“搭载”顺序扫描,以便从以下位置开始读取行:桌子的中间。
但是,如果您更新或删除一行,这种行排序就会完全崩溃:该行的旧版本将变得过时,并且(在 的情况下UPDATE)新版本可能会出现在表中完全不同的位置。旧行版本的空间最终由 autovacuum 回收,并可重新用于新插入的行。
| 归档时间: |
|
| 查看次数: |
4369 次 |
| 最近记录: |