在没有 ORDER BY 的情况下使用 LIMIT 是否安全

Is it safe to use LIMIT without ORDER BY

我正在使用 InnoDB。我需要查询从 table 中获取 10 条记录是任意顺序。

在没有 ORDER BY 的情况下使用 LIMIT 是否安全?会更快吗?

是的,你可以而且是的,它会更快(假设顺序对你来说无关紧要)。 order by 需要排序。这意味着数据库必须做更多的工作才能得到结果。最常见的是 limitorder by 一起使用,因为想要对 设置一些排序约束 您获得的 10 条记录(比如最近的、最高级别的某种记录等) .)

如果您不使用 ORDER BY,那么您就不会对记录进行排序,因此它肯定会使您的数据检索速度更快。因此,如果您只是使用 LIMIT,那么与通过 ORDER BY 检索的数据相比,它会更快。但请注意,在这种情况下,数据将不会按任何顺序排列。

就安全性而言,我不确定您在考虑哪种安全性,因为仅使用 LIMIT 且不使用 ORDER BY 子句的查询没有潜在危害。

你也可以看看这篇文章:ORDER BY … LIMIT Performance Optimization

这取决于你认为什么是安全的——如果你想要一致的结果(意思是每次都得到相同的结果,只要 table 的内容不会改变)或者如果你想要特定的结果(最大的,最新的,最旧的,等等)-比这需要顺序。如果安全起见,你认为查询不会崩溃,并且你不关心你得到的是哪个 X 结果,那么使用 limit 就可以了(这实际上是由许多 sql 工具自动完成的,比如 mysql workbench,以加快速度)。

在速度方面- 无序会更快,原因有二:

  1. 订购需要时间。
  2. 使用限制允许服务器在找到前 X 个结果时停止。您可以看到 limit 10 的查询 运行 比大型 table 上的 limit 100000 快。使用订单时,服务器必须遍历所有结果,所以不能中途停止。

所以是的,使用没有顺序的限制会更快

到目前为止,3 个答案都很好。但他们并不完全正确。

与其他答案相反,有时 省略 ORDER BY 不会 使其更快。无论如何,优化器可能碰巧以该顺序生成行。示例:

  • GROUP BY 通常是命令结果。因此,如果 ORDER BY 将匹配 GROUP BY,则无需额外的努力。
  • ORDER BY the_primary_key 可能与获取顺序匹配。对于没有 WHERE 子句的 InnoDB,这几乎可以保证是这种情况。

"Safe" 不计算。

不安全。

如果没有 order by,同一查询的连续执行结果可能不一致。

例如:(course_id是主键)。

获取第一页10行;

select course_id,grade_id from sc_base_course where  agency_id = 10000  limit 0,10;
+-----------+----------+
| course_id | grade_id |
+-----------+----------+
|        13 |        1 |
|         6 |        3 |
|        12 |        4 |
|         8 |        2 |
|         7 |        2 |
|         9 |        4 |
|        16 |        1 |
|         1 |        2 |
|        17 |        1 |
|        14 |        5 |
+-----------+----------+

获取第二页7行

select course_id,grade_id from sc_base_course where  agency_id = 10000  limit 10,10;
+-----------+----------+
| course_id | grade_id |
+-----------+----------+
|        11 |        4 |
|        12 |        4 |
|        13 |        1 |
|        14 |        5 |
|        15 |        1 |
|        16 |        1 |
|        17 |        1 |
+-----------+----------+