本章将学习如何在表上创建索引,以提高数据库的性能。
索引是什么
索引是与表关联的数据结构,它根据一个或多个列(索引键)中的值,提供对表中行的快速访问。
假设,您的数据库中有一个customers表,要找出名称以字母A
开头的所有客户:
SELECT cust_id, cust_name, address FROM customers
WHERE cust_name LIKE 'A%';
执行查询时,数据库引擎必须逐行扫描customers表,检查cust_name
列的内容。如果表包含数百万行,这个查询可能耗费很长时间。
可以通过对表添加索引来加快查询速度。
创建索引
可以使用CREATE INDEX
语句创建索引:
CREATE INDEX index_name ON table_name (column_name);
例如,要在customers表的cust_name
列上创建索引,可以使用:
CREATE INDEX cust_name_idx ON customers (cust_name);
默认情况下,索引允许条目重复,并按升序对条目进行排序。如果要生成唯一性的索引,可在CREATE
后跟UNIQUE
,如下所示:
CREATE UNIQUE INDEX cust_name_idx
ON customers (cust_name);
在MySQL中,可以查看某个表的索引,如下所示:
SHOW INDEXES FROM customers \G
创建多列索引
还可以创建跨越多个列的索引。
例如,假设数据库中有一个名为users的表,包含first_name
和last_name
字段,这些字段经常被查询,那么可以在这两个字段上创建一个多列索引来提高性能,如下所示:
CREATE INDEX user_name_idx ON users (first_name, last_name);
数据库索引可以理解为书籍的目录,可以帮助你快速定位书中的某个章节。
索引的负面效应
创建索引应该小心。因为,每次从表中添加、更新或删除一行时,必须修改该表上的所有索引。因此,索引越多,服务器需要做的工作就越多,最终导致性能下降。
以下是创建索引时,可以遵循的一些基本准则:
- 为频繁检索的字段创建索引
- 不要为很少检索的字段创建索引
- 为用于连接的字段创建索引,以提高连接查询性能
- 包含太多空值的字段不宜建索引
此外,小表不需要索引。对于小表,数据库服务器扫描表通常比先查看索引更快。
大多数数据库系统,如MySQL、SQL server等,在创建表时自动为主键和唯一性字段创建索引。
删除索引
下面语句删除索引。
DROP INDEX index_name ON table_name;
下面语句将从customers表中删除索引cust_name_idx
。
DROP INDEX cust_name_idx ON customers;
此外,如果删除一个表,那么所有相关的索引也将被删除。