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

时间:2017-04-22 20:35:41

标签: mysql indexing

  

给出以下SQL表:

     

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

     

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

SELECT * 
FROM Employee
WHERE salary = 48000
  

请说明此查询比预期慢的可能原因,并提供一个调优解决方案   解决这个问题。

我有两个想法,为什么这个查询比预期慢。一个是我们尝试SELECT *而不是SELECT Employee.salary这会减慢查询速度,因为我们必须搜索所有列而不是一列。另一个想法是salary上的索引是非群集,我们想要使用群集索引,因为公司可能非常大而且它会有必要通过salary字段组织表格。

这两个解决方案中的任何一个都会加速这个查询吗?即是将SELECT *更改为SELECT Employee.salary还是将salary上的索引显式设置为群集?

2 个答案:

答案 0 :(得分:4)

您现在拥有哪些索引?

真的"慢"?你有什么证据?

评论" SELECT *而不是SELECT Employee.salary" -

  • *是错误的表单,因为明天您可能会添加一列,从而破坏任何期望按特定顺序排列一定数量的列的代码。
  • 在找到行之后的,才会处理*salary的对比。
  • 查找行是代价高昂的部分。
  • 另一方面,如果您INDEX(salary)查看salary,则索引为"覆盖"。这意味着"数据" (其他列)不需要获取。因此,更快。但这可能超出了老师告诉你的内容。

评论"薪水指数是非集群的,我们想要使用聚集索引" -

  • 在MySQL中(不一定在其他RDBMS中),InnoDB只有一个PRIMARY KEY,它总是UNIQUE和#34;聚集"。
  • 即#"群集"暗示" unique",这似乎不适合"薪水"。
  • 在InnoDB a"二级密钥"隐含地包括PK(ssn?)的列,它可以用来覆盖数据。

"验证了查询计划" - 您是否了解了EXPLAIN SELECT ...

More Tips为给定的SELECT创建最佳索引。

答案 1 :(得分:0)

我会尝试尽可能简单,

你不能简单地将薪水作为聚集索引,除非你把它变成一个独特的或主要的,既有愚蠢又无意义,因为两个人可以有相同的工资。

根据 MYSQL文档,每个表只能有一个聚簇索引。默认情况下,数据库选择主键作为聚簇索引。

  

如果没有为表定义PRIMARY KEY,MySQL会找到   第一个UNIQUE索引,其中所有键列都是NOT NULL和InnoDB   将它用作聚集索引。

为了加快查询速度,我有一些建议,请选择二级索引,

如果您想通过直接值搜索薪水,那么基于哈希的索引是更好的选择,如果MYSQL已经支持那么。

如果要使用大于,小于或某个范围搜索值,则B树索引是更好的选择。

第一个选项比第二个选项快,但仅限于相等运算符。

希望它有所帮助。