我正在试图找出在mySQL数据库中获得第n个最高记录的更有效方法:
SELECT *
FROM table_name
ORDER BY column_name DESC
LIMIT n - 1, 1
或
SELECT *
FROM table_name AS a
WHERE n - 1 = (
SELECT COUNT(primary_key_column)
FROM products b
WHERE b.column_name > a. column_name)
column_name上有一个索引。
我认为mySQL会有效地执行限制条款,第一个选项是可行的方法。
我不太清楚第二个查询究竟是做什么的,所以如果效率更高,有人可以解释原因。
感谢。
答案 0 :(得分:2)
我在我的数据库上的那些查询上尝试了EXPLAIN(注意:优化器可能会为您的架构/数据选择不同的计划),看起来第一个看起来肯定会赢得各方面:它更易于阅读和理解,并且很可能会更快。
正如aaronls所说,并且EXPLAIN确认,第二个查询有一个相关的子查询,需要在每个行的整个表中进行额外的迭代。
由于第一个更容易阅读,我会在一个镜头中选择它。如果你确实发现它是一个瓶颈(在分析你的应用程序之后),你可以试试第二个,但我不知道它怎么可能更快。
答案 1 :(得分:1)
我认为在第二个查询中,它将执行一个内部循环来运行子查询,以便对table_name中的每一行进行评估。如果是这种情况,这意味着你可能有类似O(n ^ 2)运行时的东西。
基于此,我会亲自去看第一个查询,但如果它对我来说很重要,我会做一些性能测试。确保您对非常大的数据集进行测试,以便更好地了解性能如何扩展。对于非常小的数据集,在O(n)上运行的东西更快,但是对于大型数据集,在O(log(n))运行的东西要好得多。
答案 2 :(得分:1)
对两个查询运行解释,看看MySQL认为哪个更复杂。
答案 3 :(得分:0)
这不是一个真正的答案,但......
假设您的负载不是超重,请使用第一个查询,因为它的工作原理很简单。您可以随时返回并在必要时进行更改。
答案 4 :(得分:0)
我建议(虽然我不确定自己确切的SQL语法)你在一个简单的查询上计算了一个额外的RANK列,它根据需要对元素进行排序(DESC)。然后只需选择RANK = n的行。
你可以用一个变量来增加我的猜测。它基本上是指在此行之前有多少行,因此它应该非常容易计算。
答案 5 :(得分:0)
如果你真的关心效率,也许你应该考虑在SQL中实现selection algorithm。
答案 6 :(得分:0)
获得第二高的记录
从OrderDetails中选择max(Price)作为价格 其中价格<(从OrderDetails中选择最大(价格))
为第N个最高纪录
SELECT * FROM OrderDetails AS a WHERE n-1 =(SELECT COUNT(OrderNo)FROM OrderDetails b WHERE b.Price> a.Price)