给出以下SQL表:
员工( ssn ,姓名,部门,经理, 薪水)
您发现以下查询明显慢于 预期。
salary
上有一个索引,您已经验证了这一点 查询计划正在使用它。
SELECT *
FROM Employee
WHERE salary = 48000
请说明此查询比预期慢的可能原因,并提供一个调优解决方案 解决这个问题。
我有两个想法,为什么这个查询比预期慢。一个是我们尝试SELECT *
而不是SELECT Employee.salary
这会减慢查询速度,因为我们必须搜索所有列而不是一列。另一个想法是salary
上的索引是非群集,我们想要使用群集索引,因为公司可能非常大而且它会有必要通过salary
字段组织表格。
这两个解决方案中的任何一个都会加速这个查询吗?即是将SELECT *
更改为SELECT Employee.salary
还是将salary
上的索引显式设置为群集?
答案 0 :(得分:4)
您现在拥有哪些索引?
真的"慢"?你有什么证据?
评论" SELECT *而不是SELECT Employee.salary" -
*
是错误的表单,因为明天您可能会添加一列,从而破坏任何期望按特定顺序排列一定数量的列的代码。*
与salary
的对比。INDEX(salary)
而仅查看salary
,则索引为"覆盖"。这意味着"数据" (其他列)不需要获取。因此,更快。但这可能超出了老师告诉你的内容。评论"薪水指数是非集群的,我们想要使用聚集索引" -
PRIMARY KEY
,它总是UNIQUE
和#34;聚集"。ssn
?)的列,它可以用来覆盖数据。"验证了查询计划" - 您是否了解了EXPLAIN SELECT ...
?
More Tips为给定的SELECT
创建最佳索引。
答案 1 :(得分:0)
我会尝试尽可能简单,
你不能简单地将薪水作为聚集索引,除非你把它变成一个独特的或主要的,既有愚蠢又无意义,因为两个人可以有相同的工资。
根据 MYSQL文档,每个表只能有一个聚簇索引。默认情况下,数据库选择主键作为聚簇索引。
如果没有为表定义PRIMARY KEY,MySQL会找到 第一个UNIQUE索引,其中所有键列都是NOT NULL和InnoDB 将它用作聚集索引。
为了加快查询速度,我有一些建议,请选择二级索引,
如果您想通过直接值搜索薪水,那么基于哈希的索引是更好的选择,如果MYSQL已经支持那么。
如果要使用大于,小于或某个范围搜索值,则B树索引是更好的选择。
第一个选项比第二个选项快,但仅限于相等运算符。
希望它有所帮助。