如何加快这个SQL索引查询?

ABl*_*yon 5 mysql indexing

给定以下SQL表:

员工(ssn,姓名,部门,经理,薪水)

您发现以下查询明显慢于预期.有一个索引salary,您已验证查询计划正在使用它.

SELECT * 
FROM Employee
WHERE salary = 48000
Run Code Online (Sandbox Code Playgroud)

请说明此查询比预期慢的可能原因,并提供解决该原因的调优解决方案.

我有两个想法,为什么这个查询比预期慢.一个是我们正在尝试SELECT *而不是SELECT Employee.salary减慢查询速度,因为我们必须搜索所有列而不是一个.另一个想法是,该指数salary非群集,和我们想用一个聚集索引,因为该公司可能会非常大,这将是有意义由组织表salary场.

这两个解决方案中的任何一个都会加速这个查询吗 即要么改变SELECT *SELECT Employee.salary或明确设置的指标salary要群集?

Ric*_*mes 4

现在有哪些指标?

真的很“慢”吗?你有什么证据?

对“SELECT * 而不是 SELECT Employee.salary”的评论 --

  • *这是不好的形式,因为明天您可能会添加一列,从而破坏任何期望按特定顺序包含一定数量列的代码。
  • 直到找到行之后才会进行*vs 的处理。salary
  • 定位行是成本高昂的部分。
  • 另一方面,如果您有INDEX(salary)查看,salary那么该索引就是“覆盖”。这意味着不需要获取“数据”(其他列)。因此,更快。但这可能超出了你的老师告诉你的范围。

对“工资上的索引是非聚集索引,我们想使用聚集索引”的评论--

  • 在 MySQL 中(不一定在其他 RDBMS 中),InnoDB 恰好有一个PRIMARY KEY,并且它始终是UNIQUE“集群”的。
  • 也就是说,“聚集”意味着“独特”,这对于“薪水”来说似乎不合适。
  • 在 InnoDB 中,“辅助键”隐式包含 PK (?) 的列ssn,通过它可以访问数据。

“验证查询计划”——你了解过吗EXPLAIN SELECT ...

有关为给定创建最佳索引的更多提示SELECT