【问题标题】:Is it safe to use LIMIT without ORDER BY在没有 ORDER BY 的情况下使用 LIMIT 是否安全
【发布时间】:2016-04-21 03:01:49
【问题描述】:

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

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

【问题讨论】:

  • 你可以使用limit而不用order by。你想要哪种类型的安全?
  • 我猜他所说的“安全”是指最终将检索所有数据并且没有重复的行。那么它“安全”吗?

标签: mysql innodb


【解决方案1】:

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

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

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

【讨论】:

  • 我刚刚遇到了这个问题。没有order by,数据的顺序是不可预测的。
  • 当然,通过执行代码不会发生真正随机的事情。有一些规则和程序总是按特定顺序为您提供数据,因此它是可预测的
【解决方案2】:

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

就速度而言——无序会使其更快,原因有二:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      这不安全。

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

      Refer to mysql limit collapse, which result in data interaction

      例如:(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 |
      +-----------+----------+
      

      【讨论】:

        【解决方案5】:

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

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

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

        “安全”不计算。

        【讨论】:

        • “安全”不计算。 +1
        猜你喜欢
        • 2011-10-12
        • 1970-01-01
        • 1970-01-01
        • 2020-06-16
        • 2021-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-10
        相关资源
        最近更新 更多