为啥'select * from Employee group by Id'比直接使用Employee表快得多?

Posted

技术标签:

【中文标题】为啥\'select * from Employee group by Id\'比直接使用Employee表快得多?【英文标题】:Why 'select * from Employee group by Id' is much faster than directly use the Employee table?为什么'select * from Employee group by Id'比直接使用Employee表快得多? 【发布时间】:2018-09-19 01:33:27 【问题描述】:

在 LeetCode 数据库问题中,有一个称为“员工的收入高于他们的经理”。链接在这里:https://leetcode.com/problems/employees-earning-more-than-their-managers/description/。逻辑很简单:

select t.Name
from Employee t
join Employee t1
on t.ManagerId = t1.id
where t.Salary>t1.Salary

这需要 350 毫秒。但后来我发现了一个快速提交:

select a.Name as Employee from
(
    select * from Employee
    group by Id
) a
left join
(
    select * from Employee
    group by Id
) b on a.ManagerId = b.Id
where a.Salary > b.Salary

花费 240 毫秒。症结可能在于select * from Employee group by Id。所以我想知道为什么select * from table group by id 可以使查询更快。谢谢。

【问题讨论】:

你比较了两个查询的执行计划了吗? 您可以通过此站点探索执行计划:sqlfiddle.com/#!9/623025/1 补充阅读材料:dev.mysql.com/doc/refman/5.6/en/bnl-bka-optimization.html 感谢您的建议!在网站上,第二个查询并不比第一个查询快。我想问题可能出在服务器之间。这些建议真的很有帮助,再次感谢! (^_^) 【参考方案1】:

在第一次查询时你比较

on t.gerId = t1.id

第二次

on a.ManagerId = b.Id

第一个是内连接,第二个是左连接,这些查询和结果不一样。

【讨论】:

很抱歉打错了,我已经修改了。但事实是左连接与内连接大约有时间成本(320ms)。所以我认为“加入”的方式没什么区别。

以上是关于为啥'select * from Employee group by Id'比直接使用Employee表快得多?的主要内容,如果未能解决你的问题,请参考以下文章

为啥“SELECT 1 from <table>”会导致另一个进程上的 LCK_M_IX 执行 DELETE

sql select as的用法

Oracle/SQL:为啥查询“SELECT * FROM records WHERE rownum >= 5 AND rownum <= 10” - 返回零行

PostgreSQL 中的快速随机行:为啥 time (floor(random()*N)) + (select * from a where id = const) 比 select where i

AWS Athena 为啥单行或其列的大小不能超过 32 MB 错误 select * from tableName 但不是在 where 条件

为啥select count(_) from t,在InnoDB引擎中比MyISAM 慢