SQL CREATE INDEX 语句
在本教程中,您将学习如何在表上创建索引以提高数据库性能。
什么是索引?
索引是与表相关联的一种数据结构,可根据一个或多个列(索引键)中的值提供对表中行的快速访问。
假设您的数据库中有一个 customers 表,并且您想使用以下语句找出名称以字母 A 开头的所有客户。
SELECT cust_id, cust_name, address FROM customers
WHERE cust_name LIKE 'A%';
要找到这样的客户,服务器必须逐一扫描 customers 表中的每一行并检查名称列的内容。 虽然它适用于只有几行的表,但想象一下如果表包含数百万行,回答查询可能需要多长时间。 在这种情况下,您可以通过对表应用索引来加快速度。
创建索引
您可以使用 CREATE INDEX
语句创建索引:
例如,要在客户表中的 name 列上创建索引,您可以使用:
CREATE INDEX cust_name_idx ON customers (cust_name);
默认情况下,索引将允许重复条目并按升序对条目进行排序。 要要求唯一的索引条目,请在 CREATE
之后添加关键字 UNIQUE
,如下所示:
CREATE UNIQUE INDEX cust_name_idx
ON customers (cust_name);
在 MySQL 中,您可以查看特定表上的可用索引,如下所示:
提示: 如果 SQL 语句对于当前窗口来说太宽,则使用 \G
而不是 ;
以垂直显示结果而不是正常的表格格式来终止 SQL 语句。
创建多列索引
您还可以构建跨多列的索引。 例如,假设您的数据库中有一个名为 users 的表,其中包含列 first_name 和 last_name,并且您经常使用这些列访问用户的记录,那么您可以在这两列上一起构建索引以提高性能,如下所示:
提示:您可以将数据库索引视为书籍的索引部分,可帮助您快速查找或定位书中的特定主题。
索引的缺点
应小心创建索引。 因为,每次从表中添加、更新或删除行时,都必须修改该表上的所有索引。 因此,您拥有的索引越多,服务器需要做的工作就越多,最终导致性能下降。
以下是创建索引时可以遵循的一些基本准则:
- 您经常用于检索数据的索引列。
- 不要为从不用作检索键的列创建索引。
- 用于连接以提高连接性能的索引列。
- 避免包含过多 NULL 值的列。
另外,小表不需要索引,因为在小表的情况下,服务器通常扫描表而不是先看索引会更快。
注意:大多数数据库系统,如 MySQL、SQL server 等,在创建表时会自动为 PRIMARY KEY
和 UNIQUE
列创建索引。
删除索引
您可以使用以下语句删除不再需要的索引。
以下语句将从 customers 表中删除索引 cust_name_idx。
DROP INDEX cust_name_idx ON customers;
此外,如果您删除一个表,那么所有关联的索引也会被删除。
警告:您应该在删除索引之前彻底调查。 作为经验法则,永远不要盲目地创建或删除索引。