简单选择第n个最高

时间:2009-04-02 02:38:08

标签: mysql database

我正在试图找出在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会有效地执行限制条款,第一个选项是可行的方法。

我不太清楚第二个查询究竟是做什么的,所以如果效率更高,有人可以解释原因。

感谢。

7 个答案:

答案 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)