Skip to content

SQL Create Index

CREATE INDEX 语句用于在表中的列上创建索引。索引是特殊的查找表,数据库搜索引擎可以使用它们来加快数据检索速度。

本质上,表上的索引就像书本末尾的索引一样:它可以帮助数据库快速找到数据,而无需扫描整个表(即“全表扫描”)。

索引主要用于提升查询性能。当查询包含引用索引列的 WHERE 子句或连接条件时,数据库通常可以使用索引更快地定位相关行,而不是扫描表中的每一行(即“全表扫描”)。

用户不会直接看到或与索引交互;它们由数据库优化器使用,以提高查询执行速度。

权衡:虽然索引可以加速读操作(SELECT 查询),但它们可能会减慢数据修改操作(INSERT、UPDATE、DELETE)。这是因为每当索引列中的数据发生变化时,索引本身也必须更新。因此,重要的是对频繁用于搜索条件和连接的列战略性地创建索引,并避免对表(特别是写入负载重的表)过度索引。

在单列或多列上创建基本索引。索引列中允许存在重复值:

CREATE INDEX index_name ON table_name (column1_name [ASC|DESC], column2_name [ASC|DESC], …);

在表上创建唯一索引。这确保了索引列(或列组合)中的所有值都是唯一的。不允许重复值,如果尝试插入重复值,将导致错误。

CREATE UNIQUE INDEX index_name ON table_name (column_name);

注意:创建索引的具体语法在不同的数据库系统(例如 PostgreSQL、MySQL、SQL Server、Oracle)之间可能略有不同。请始终查阅您特定数据库系统的文档。一些系统还提供针对不同场景优化的不同类型的索引(例如 B 树、哈希、全文、GiST、GIN)。

以下 SQL 语句在 “Employees” 表的 “LastName” 列上创建一个名为 “idx_lastname” 的索引:

CREATE INDEX idx_lastname ON Employees (LastName);

这将加速以下查询:SELECT * FROM Employees WHERE LastName = 'Smith';

如果您经常搜索列的组合,可以创建复合索引。索引定义中列的顺序很重要。

CREATE INDEX idx_fullname ON Employees (LastName, FirstName);

该索引可以优化仅按 LastName 过滤的查询,或同时按 LastName 和 FirstName 过滤的查询(例如,WHERE LastName = 'Doe' AND FirstName = 'John')。

为了确保 Users 表中的所有电子邮件地址都是唯一的,您可以创建一个唯一索引:

CREATE UNIQUE INDEX uidx_email ON Users (Email);

尝试插入或更新具有已存在的电子邮件地址的行将导致错误。

  • 索引频繁用于 WHERE 子句和 JOIN 条件的列。
  • 考虑为外键列创建索引。
  • 不要过度索引。每个索引都会占用存储空间并增加写入操作的开销。
  • 定期审查和维护索引。应删除未使用的索引。
  • 使用特定于数据库的工具来分析查询性能,并识别缺失或低效的索引。