SQL索引怎么创建和使用?

文章导读
上一个 测验 下一个 SQL 索引 SQL 索引 是特殊的查找表,用于加速数据检索过程。它们保存指向数据库中存储数据的指针,从而更容易在数据库表中定位所需的数据记录。
📋 目录
  1. SQL 索引
  2. CREATE INDEX 语句
  3. 索引类型
  4. SQL 唯一索引
  5. SQL 单列索引
  6. SQL 复合索引
  7. SQL 隐式索引
  8. SQL DROP INDEX 语句
  9. 何时应避免使用索引?
A A

SQL - 索引

目录
  • SQL 索引
  • CREATE INDEX 语句
  • 索引类型
  • SQL 唯一索引
  • SQL 单列索引
  • SQL 复合索引
  • SQL 隐式索引
  • SQL DROP INDEX 语句
  • 何时应避免使用索引?


上一个
测验
下一个

SQL 索引

SQL 索引 是特殊的查找表,用于加速数据检索过程。它们保存指向数据库中存储数据的指针,从而更容易在数据库表中定位所需的数据记录。

SQL 索引的工作方式类似于书籍或期刊的目录。

虽然索引可以加速数据检索查询(SELECT 语句)的性能,但会减慢数据输入查询(UPDATE 和 INSERT 语句)的性能。然而,这些索引不会影响数据本身。

SQL 索引需要在数据库中占用自己的存储空间。尽管如此,用户无法物理查看它们,因为它们只是性能工具。

CREATE INDEX 语句

在 SQL 中,可以使用 CREATE INDEX 语句创建索引。该语句允许您为索引命名、指定表以及要索引的列或列,并指示索引是升序还是降序。

最好在大表中经常用于数据检索查询的列上创建索引。

语法

CREATE INDEX 的基本语法如下:

CREATE INDEX index_name ON table_name;

示例

首先,让我们创建一个名为 CUSTOMERS 的表,如下所示:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR(20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR(25),
   SALARY DECIMAL(18, 2),
   PRIMARY KEY (ID)
);

现在,我们将在 CUSTOMERS 表的 AGE 列上创建索引:

CREATE INDEX idx_age
ON CUSTOMERS(AGE);

输出结果如下所示:

Query OK, 0 rows affected (0.03 sec)

索引类型

可以使用 CREATE INDEX 语句创建多种类型的索引。它们是:

  • Unique Index
  • Single-Column Index
  • Composite Index
  • Implicit Index

我们将在本教程中逐一讨论所有索引。

SQL 唯一索引

唯一索引不仅用于性能,还用于数据完整性。唯一索引不允许向表中插入任何重复值。当在数据库表上应用 PRIMARY 和 UNIQUE 约束时,它会自动创建唯一索引,以防止用户向索引表列中插入重复值。

语法

创建 SQL UNIQUE INDEX 的基本语法如下:

CREATE UNIQUE INDEX index_name
on table_name (column_name);

示例

在本示例中,我们在 ADDRESS 列上创建唯一索引:

CREATE UNIQUE INDEX idx_address
ON CUSTOMERS(ADDRESS);

产生的输出如下所示:

Query OK, 0 rows affected (0.01 sec)

SQL 单列索引

Single-Column Index 是在表的一个列上创建的。它允许数据库基于该特定列的值快速定位行,从而在按该列过滤、搜索或排序时提高查询性能。

当您在单列上创建索引时,数据库内部会构建一个数据结构(通常是 B-tree),使其查找速度比扫描整个表快得多。

语法

创建 SQL 单列索引的基本语法如下:

CREATE INDEX index_name
ON table_name (column_name);

示例

在下面的示例中,我们在 SALARY 列上创建索引:

CREATE INDEX idx_salary
ON CUSTOMERS(SALARY);

获得以下输出:

Query OK, 0 rows affected (0.02 sec)

SQL 复合索引

Composite Index(复合索引)是在表中的两个或多个列上创建的索引。当查询在 WHERE 子句、JOIN 条件或 ORDER BY 语句中共同使用多个列时,它非常有用。复合索引有助于数据库根据这些列的值组合快速定位行。

与单列索引不同,复合索引可以同时优化涉及多个列的查询。但是,复合索引中列的顺序非常重要。

Syntax

复合索引的基本语法如下:

CREATE INDEX index_name
on table_name (column1, column2);

Example

在这里,我们在 (AGE, SALARY) 列上创建了一个复合索引:

CREATE INDEX idx_age_salary
ON CUSTOMERS(AGE, SALARY);

我们得到如下输出:

Query OK, 0 rows affected (0.02 sec)

SQL 隐式索引

隐式索引是由数据库服务器在创建对象时自动创建的索引。例如,在 MySQL 数据库中,当在表上创建 primary key 和 unique 约束时,会自动创建索引。

例如,当您在列上定义 PRIMARY KEYUNIQUE 约束时,数据库会自动在该列上创建一个索引,以确保值保持唯一。同样,当您定义 FOREIGN KEY 时,根据数据库系统不同,可能会在引用列上创建索引以加快查找。

SQL DROP INDEX 语句

可以使用 SQL DROP 命令删除索引。删除索引可能会影响数据库的查询性能。因此,只有在绝对必要时才应删除索引。

Syntax

删除索引的基本语法如下:

DROP INDEX index_name;

Example

在以下示例中,我们从 CUSTOMERS 表中删除 idx_salary 索引:

DROP INDEX idx_salary ON CUSTOMERS;

得到如下输出:

Query OK, 0 rows affected (0.01 sec)

何时应避免使用索引?

尽管索引旨在提升数据库性能,但在某些情况下应避免使用它们。

以下指南指出了何时应重新考虑使用索引的情况。

  • 不应在小表上使用索引。
  • 不应在频繁进行大量批量更新或插入操作的表上使用索引。
  • 不应在包含大量 NULL 值的列上使用索引。
  • 不应对频繁被操作的列进行索引。