在处理大量数据的数据库中,查询性能往往是至关重要的。索引作为一种优化手段,就像书籍目录一样存储了各个数据所在的位置,在查找数据时可根据索引直接查找到对应数据,而不需要进行全表扫描比对,因此可以显著提高数据检索的速度。
索引的工作原理
索引就像是一本书的目录,它存储了数据表中某一列或某几列值与对应的行位置的映射关系。当执行查询时,数据库引擎可以利用索引快速定位到所需的数据,而无需扫描整个表。
在索引创建之后,它记录与被索引字段相关联的位置值。当表里添加新数据时,索引里也会添加新项。当数据库执行查询,而且WHERE条件里指定的字段己经设置了索引时,数据库会首先在索引里搜索WHERE子句里指定的值。如果在索引里找到了这个值,索引就可以返回被搜索数据在表里的实际位置。
SELECT * FROM table_name WHERE NAME='SMITH';
如上图所示,这里引用了索引NAME来寻找“SMITH”的位置,在找到了位置之后,数据就能迅速地从表里检索出来。如果表里没有索引,在执行同样这个查询时,数据库就会进行全表扫描,也就是说表里的每行数据都会被读取并与“SMITH”进行比对,因此检索速度比使用索引时较慢。
索引的创建
可以使用 CREATE INDEX
语句来创建索引。例如:
CREATE INDEX idx_column_name ON table_name (column_name);
对于多列的组合索引,可以这样写:
CREATE INDEX idx_column_name ON table_name (column1, column2);
索引的删除
当不再需要某个索引时,可以使用 DROP INDEX
语句来删除索引:
DROP INDEX idx_column_name ON table_name;
索引的使用建议
在以下场景中,建议使用索引来优化性能:
-
经常用于搜索、排序和连接的列。
-
具有高选择性的列,即不同值较多的列。
-
主键和外键列通常需要创建索引。
但在以下场景中,则不推荐使用索引:
-
数据量较小的表,因为建立索引带来的开销可能超过其带来的性能提升。
-
频繁更新的列,因为每次更新都会导致索引的维护,增加系统负担。
-
列的值分布非常均匀,选择性低的列。