MySQL:获得列中第二大数值的最佳方法?没有查询限制
问题: 给定一个带有列MySQL:获得列中第二大数值的最佳方法?没有查询限制,mysql,sql,optimization,Mysql,Sql,Optimization,问题: 给定一个带有列age(类型:INTEGER)的表people,编写一个查询以搜索并返回第二大年龄 我的解决方案: SELECT MAX(age) FROM people WHERE age <> (SELECT MAX(age) FROM people); 这是一个非常简单的问题,但我想知道哪一个更为优化,即最小化SQL负载的查询。我不熟悉SQL设置中的算法复杂性,但我猜第一个查询是在O(n^2)中运行的,因为MySQL需要找到长度分别为n-1和n的两个查询的最大值。这个分
age
(类型:INTEGER)的表people
,编写一个查询以搜索并返回第二大年龄
我的解决方案:
SELECT MAX(age) FROM people
WHERE age <> (SELECT MAX(age) FROM people);
这是一个非常简单的问题,但我想知道哪一个更为优化,即最小化SQL负载的查询。我不熟悉SQL设置中的算法复杂性,但我猜第一个查询是在
O(n^2)
中运行的,因为MySQL需要找到长度分别为n-1
和n
的两个查询的最大值。这个分析正确吗?如果是这样,我觉得我应该选择我的第二个解决方案。如果您有任何想法,我将不胜感激,谢谢 我认为限制
/偏移
是最简单的方法:
select age
from people
group by age
order by age desc
limit 1, 1;
但是,您的第一个版本:
SELECT MAX(age)
FROM people
WHERE age <> (SELECT MAX(age) FROM people);
在MySQL中,聚合可能非常昂贵。
在第一次查询中不需要分组方式(如所写)。如果您有索引(年龄)
,则第一次查询是非常优化的;第二个从性能角度看是可怕的;第三个很一般。@RickJames<在第一次查询中需要代码>分组依据
。OP似乎想要第二个不同的值,而不是第二行中的值(可能与最大值相同)。好的,groupby
。我确认第一个查询只涉及索引的几行;第三是速度快。
SELECT MAX(age)
FROM people
WHERE age <> (SELECT MAX(age) FROM people);
SELECT age
FROM people
WHERE age <> (SELECT MAX(age) FROM people)
ORDER BY age DESC
LIMIT 1;