在本教程中,您将学习如何在表上创建索引以提高数据库性能。
索引是与表相关联的数据结构,它基于一个或多个列(索引键)中的值提供对表中行的快速访问。
假设您的数据库中有一个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_name和last_name,和您经常访问使用这些列,那么你可以建立在两个列的索引在一起以提高性能的用户的记录,如下图:
CREATE INDEX user_name_idx ON users (first_name, last_name);
提示:您可以将数据库索引视为书籍的索引部分,以帮助您快速查找或定位书籍中的特定主题。
索引应谨慎创建。因为每次在表中添加,更新或删除行时,都必须修改该表上的所有索引。因此,拥有的索引越多,服务器需要执行的工作就越多,这最终会导致性能降低。
以下是创建索引时可以遵循的一些基本准则:
为您经常用来检索数据的列创建索引。
不要为从未用作检索键的列创建索引。
用于联接以改善联接性能的索引列。
避免包含太多NULL值的列。
同样,小表不需要索引,因为在小表的情况下,服务器扫描表通常比先查看索引要快。
注意:创建表时,大多数数据库系统(如MySQL,SQL Server等)都会自动为表PRIMARY KEY和UNIQUE列创建索引。
您可以使用以下语句删除不再需要的索引。
DROP INDEX index_name ON table_name;
下面的语句将从customers表删除索引cust_name_idx。
DROP INDEX cust_name_idx ON customers;
此外,如果删除表,那么所有关联的索引也会被删除。
警告:删除索引之前,您应该进行核对删除索引会造成的影响。作为一般经验法则,切勿盲目创建或删除索引。