mysql - 为 SQL 查询选择最佳索引

标签 mysql sql indexing

我正在数据库管理类(class)中做一些问题集,但我无法解决这个具体问题。

我们有以下关系:

Emp (id, name, age, sal, ...)

以及以下查询:

SELECT id
FROM Emp
WHERE age > (select max(sal) from Emp);

然后我们应该选择一个索引,它将成为一个很好的查询优化器。我的答案是只使用 Emp(age) 但问题的解决方案是

Emp(age)

&

Emp(sal)

怎么有2个索引?我似乎无法理解为什么你需要的不仅仅是年龄属性..

最佳答案

当然,您意识到该查询是无意义的,将 agesal(可能是薪水)进行比较。也就是说,两个索引适用于:

SELECT e.id
FROM Emp e
WHERE e.age > (select max(e2.sal) from Emp e2);

我添加了表别名来强调查询两次引用 Emp 表。

要从表中获取最大 sal,您需要在 emp(sal) 上建立索引。最多就是简单的索引查找操作。

然后您想将其与年龄进行比较。好吧,为了与 age 进行比较,您需要在 emp(age) 上建立索引。这是对 emp 的完全独立的引用,没有对 sal 的引用,因此您不能将这两列放在单个索引中。

age 的索引可能不是必需的。查询可能会返回大量行,而返回大量行的表通常不会从二级索引中受益。它可以从索引中受益的一种情况是如果age是一个聚集索引(即通常是主键中的第一列)。但是,我不推荐这样的索引结构。

关于mysql - 为 SQL 查询选择最佳索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55207233/

相关文章:

mysql - 在 mysql 中从 select 创建表时如何指定排序规则?

mysql - MySQL 查询优化

mysql - 使用 ON DUPLICATE KEY UPDATE 进行大的自动插入

php - 将值添加到文件中的数组并保存

java - 如何在 Lucene ( JAVA ) 的 BM25 实现中计算 avgLengthPath

arrays - 算法,以便我可以以某种方式索引 2^n 组合,这样我就可以在不使用数组的情况下从 1 的任何索引值回溯到 2^n

php - 引用php代码部分

mysql - 将数据库时间戳值与今天的日期进行比较,并在 codeigniter 中获取结果

mysql - 在 Rails 中动态构建查询

单列的 SQL 分组查询结果