索引(Index)是数据库中一种用于提高查询性能的数据结构。索引在数据库表的一个或多个列上创建,类似于书的目录,通过索引可以快速定位和检索表中的数据行,而无需扫描整个表。尽管索引可以大幅提升查询性能,但也会带来一些额外的存储和维护开销。
特点
- 提高查询速度:通过索引,可以显著减少查询所需的扫描行数,提升查询性能。
- 加速排序和分组操作:索引可以加速
ORDER BY
、GROUP BY
等操作。 - 唯一性约束:唯一索引(Unique Index)确保索引列中的值是唯一的。
- 存储开销:索引需要额外的存储空间来维护索引数据结构。
- 维护开销:插入、更新和删除操作需要维护索引,这可能会增加操作成本。
索引类型
- 单列索引:在单个列上创建的索引。
- 组合索引:在多个列上创建的索引,也称为复合索引。
- 唯一索引:索引列中的值必须唯一。
- 全文索引:用于加速全文搜索。
- 聚集索引:表中的数据按索引列排序,主键默认是聚集索引。
- 非聚集索引:表中的数据物理存储顺序与索引顺序无关。
创建索引的SQL语法
-
创建单列索引:
CREATE INDEX idx_employee_last_name ON employees(last_name);
-
创建组合索引:
CREATE INDEX idx_employee_name ON employees(first_name, last_name);
-
创建唯一索引:
CREATE UNIQUE INDEX idx_unique_email ON employees(email);
-
删除索引:
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_name
和last_name
列上创建组合索引:
CREATE INDEX idx_employee_name ON employees(first_name, last_name);
这个索引将加速基于first_name
和last_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;
注意事项
- 选择性:索引列的选择性越高(唯一值越多),索引的效率越高。
- 维护成本:插入、更新和删除操作需要更新索引,因此在频繁写操作的列上使用索引需谨慎。
- 存储空间:索引需要额外的存储空间,创建过多的索引可能导致存储和性能问题。
- 查询优化器:数据库查询优化器会自动选择合适的索引来执行查询,创建索引时需要考虑查询模式。
通过合理使用索引,可以显著提升数据库查询性能,但与此同时也需要权衡存储和维护成本,确保索引的选择和设计符合应用需求。