Oracle(15)什么是索引(Index)?

126 阅读3分钟

索引(Index)是数据库中一种用于提高查询性能的数据结构。索引在数据库表的一个或多个列上创建,类似于书的目录,通过索引可以快速定位和检索表中的数据行,而无需扫描整个表。尽管索引可以大幅提升查询性能,但也会带来一些额外的存储和维护开销。

特点

  1. 提高查询速度:通过索引,可以显著减少查询所需的扫描行数,提升查询性能。
  2. 加速排序和分组操作:索引可以加速ORDER BYGROUP BY等操作。
  3. 唯一性约束:唯一索引(Unique Index)确保索引列中的值是唯一的。
  4. 存储开销:索引需要额外的存储空间来维护索引数据结构。
  5. 维护开销:插入、更新和删除操作需要维护索引,这可能会增加操作成本。

索引类型

  1. 单列索引:在单个列上创建的索引。
  2. 组合索引:在多个列上创建的索引,也称为复合索引。
  3. 唯一索引:索引列中的值必须唯一。
  4. 全文索引:用于加速全文搜索。
  5. 聚集索引:表中的数据按索引列排序,主键默认是聚集索引。
  6. 非聚集索引:表中的数据物理存储顺序与索引顺序无关。

创建索引的SQL语法

  1. 创建单列索引

    CREATE INDEX idx_employee_last_name ON employees(last_name);
    
  2. 创建组合索引

    CREATE INDEX idx_employee_name ON employees(first_name, last_name);
    
  3. 创建唯一索引

    CREATE UNIQUE INDEX idx_unique_email ON employees(email);
    
  4. 删除索引

    DROP INDEX idx_employee_last_name;
    

索引示例

示例1:创建单列索引

假设有一个employees表,我们在last_name列上创建一个索引:

CREATE TABLE employees (
    employee_id NUMBER PRIMARY KEY,
    first_name VARCHAR2(50),
    last_name VARCHAR2(50),
    email VARCHAR2(100)
);

CREATE INDEX idx_employee_last_name ON employees(last_name);

这个索引将加速基于last_name列的检索操作,例如:

SELECT * FROM employees WHERE last_name = 'Smith';

示例2:创建组合索引

first_namelast_name列上创建组合索引:

CREATE INDEX idx_employee_name ON employees(first_name, last_name);

这个索引将加速基于first_namelast_name组合的检索操作,例如:

SELECT * FROM employees WHERE first_name = 'John' AND last_name = 'Doe';

示例3:创建唯一索引

email列上创建唯一索引,以确保每个员工的电子邮件地址是唯一的:

CREATE UNIQUE INDEX idx_unique_email ON employees(email);

示例4:删除索引

删除之前创建的idx_employee_last_name索引:

DROP INDEX idx_employee_last_name;

注意事项

  • 选择性:索引列的选择性越高(唯一值越多),索引的效率越高。
  • 维护成本:插入、更新和删除操作需要更新索引,因此在频繁写操作的列上使用索引需谨慎。
  • 存储空间:索引需要额外的存储空间,创建过多的索引可能导致存储和性能问题。
  • 查询优化器:数据库查询优化器会自动选择合适的索引来执行查询,创建索引时需要考虑查询模式。

通过合理使用索引,可以显著提升数据库查询性能,但与此同时也需要权衡存储和维护成本,确保索引的选择和设计符合应用需求。