假设有以下数据库表格存储了员工的信息:

表格:employees

ID

Name

Department

Salary

1

John

HR

50000

2

Mary

IT

60000

3

Michael

Sales

55000

4

Jessica

Finance

52000

现在我们想查询所有在部门"IT"的员工的薪水。我们可以创建一个基于"Department"列的索引。

1、覆盖索引

CREATE INDEX idx_department ON employees (Department, Salary);

这个例子中,索引包含了"Department"列和"Salary"列。当我们执行以下查询时:

SELECT Salary FROM employees WHERE Department = 'IT';

由于索引已经包含了查询所需的"Salary"列,数据库可以直接从索引中获取薪水数据,而无需再去查找数据行。这样的查询利用了覆盖索引,可以更高效地满足查询需求。

2、非覆盖索引

CREATE INDEX idx_department ON employees (Department);

在这个例子中,索引只包含了“Department”列,而没有包含“Salary”列。执行以下命令查询:

SELECT Salary FROM employees WHERE Department = 'IT';

虽然索引可以帮助定位匹配的行,但是索引本身并不包含"Salary"列的数据。因此,数据库需要再次访问数据行,才能获取员工的薪水数据。这样的查询需要通过非覆盖索引和额外的数据库查找来满足查询需求。

总结:

  • 覆盖索引:索引包含了查询所需要的列,可以直接从索引中获取数据,无需再次访问数据行。
  • 非覆盖索引:索引仅包含部分查询所需的列,查询时需要通过索引定位匹配行,然后再访问数据行才能获取完整的数据。