【发布时间】:2016-04-21 03:01:49
【问题描述】:
我正在使用 InnoDB。我需要查询以从表中获取 10 条记录是任何顺序。
在没有 ORDER BY 的情况下使用 LIMIT 是否安全?会不会更快?
【问题讨论】:
-
你可以使用limit而不用order by。你想要哪种类型的安全?
-
我猜他所说的“安全”是指最终将检索所有数据并且没有重复的行。那么它“安全”吗?
我正在使用 InnoDB。我需要查询以从表中获取 10 条记录是任何顺序。
在没有 ORDER BY 的情况下使用 LIMIT 是否安全?会不会更快?
【问题讨论】:
如果您没有使用 ORDER BY,那么您就没有对记录进行排序,因此它肯定会使您的数据检索更快。因此,如果您只是使用 LIMIT,那么与通过 ORDER BY 检索的数据相比,它会更快。但请注意,在这种情况下,数据不会按任何顺序排列。
就安全性而言,我不确定您考虑的是哪种安全性,因为仅使用 LIMIT 且不使用 ORDER BY 子句的查询没有潜在危害。
【讨论】:
order by,数据的顺序是不可预测的。
这取决于你认为什么是安全的——如果你想要一致的结果(意思是,只要表格的内容不会改变,每次都得到相同的结果)或者你想要特定的结果(最大的、最新的、最旧的,等等)——比这需要秩序。如果安全起见,您的意思是查询不会崩溃,并且您不在乎得到哪个 X 结果-比是的,使用 limit 很好(这实际上是由许多 sql 工具自动完成的,例如 mysql workbench,以加快速度)。
就速度而言——无序会使其更快,原因有二:
limit 10 的查询将比limit 100000 运行得更快。使用 order 时,服务器必须遍历所有结果,所以不能中途停止。所以是的,使用无顺序限制会更快
【讨论】:
是的,你可以,是的,它会更快(假设顺序对你来说并不重要)。 order by 需要排序。这意味着数据库必须做更多的工作才能得到结果。最常见的limit 与order by 一起使用,因为想要对您获得的哪些 10 条记录设置一些排序限制(比如最近的、某种最高排名等)
【讨论】:
这不安全。
如果没有 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 |
+-----------+----------+
【讨论】:
到目前为止的 3 个答案都很好。但它们并不完全正确。
与其他答案相反,有时忽略ORDER BY 将不会使其更快。无论如何,优化器都可能碰巧按该顺序生成行。例子:
GROUP BY 通常会订购结果。因此,如果 ORDER BY 与 GROUP BY 匹配,则无需额外的努力。ORDER BY the_primary_key 可能与获取顺序匹配。对于没有 WHERE 子句的 InnoDB,几乎可以保证是这种情况。“安全”不计算。
【讨论】: