SQL 创建索引(CREATE INDEX 语句)

在本教程中,您将学习如何在表上创建索引以提高数据库性能。

什么是索引?

索引是与表相关联的数据结构,它基于一个或多个列(索引键)中的值提供对表中行的快速访问。

假设您的数据库中有一个customers表,并且您想使用以下语句找出名字是以字母A开头的所有客户。

SELECT cust_id, cust_name, address FROM customers 
WHERE cust_name LIKE 'A%';

为了找到这样的客户,服务器必须在customers表中逐行扫描并检查名字列的内容。尽管对于只有几行的表来说,它可以正常工作,但是请想象一下,如果该表包含一百万行,那么回答查询可能需要花费多长时间。在这种情况下,您可以通过将索引应用于表来加快处理速度。

创建索引

您可以使用以下CREATE INDEX语句创建索引:

CREATE INDEX index_name ON table_name (column_name);

例如,要在客户表的name列上创建索引,可以使用:

CREATE INDEX cust_name_idx ON customers (cust_name);

默认情况下,索引将允许重复的条目并按升序对条目进行排序。 要要求唯一索引条目,请在CREATE之后添加关键字UNIQUE,如下所示:

CREATE UNIQUE INDEX cust_name_idx 
ON customers (cust_name);

在MySQL中,您可以查看特定表上的可用索引,如下所示:

mysql> SHOW INDEXES FROM customers \G

提示:用\G代替分号(;)终止SQL语句。 如果结果对于当前窗口而言太宽,则垂直显示结果而不是常规表格格式。

创建多列索引

您还可以构建跨多列的索引。例如,假设您在数据库中已命名表的用户具有列first_namelast_name,和您经常访问使用这些列,那么你可以建立在两个列的索引在一起以提高性能的用户的记录,如下图:

CREATE INDEX user_name_idx ON users (first_name, last_name);

提示:您可以将数据库索引视为书籍的索引部分,以帮助您快速查找或定位书籍中的特定主题。

索引的缺点

索引应谨慎创建。因为每次在表中添加,更新或删除行时,都必须修改该表上的所有索引。因此,拥有的索引越多,服务器需要执行的工作就越多,这最终会导致性能降低。

以下是创建索引时可以遵循的一些基本准则:

  • 为您经常用来检索数据的列创建索引。

  • 不要为从未用作检索键的列创建索引。

  • 用于联接以改善联接性能的索引列。

  • 避免包含太多NULL值的列。

同样,小表不需要索引,因为在小表的情况下,服务器扫描表通常比先查看索引要快。

注意:创建表时,大多数数据库系统(如MySQL,SQL Server等)都会自动为表PRIMARY KEYUNIQUE列创建索引。

删除索引

您可以使用以下语句删除不再需要的索引。

DROP INDEX index_name ON table_name;

下面的语句将从customers表删除索引cust_name_idx

DROP INDEX cust_name_idx ON customers;

此外,如果删除表,那么所有关联的索引也会被删除。

警告:删除索引之前,您应该进行核对删除索引会造成的影响。作为一般经验法则,切勿盲目创建或删除索引。