今天给大家介绍一下数据库中的索引,索引在平常的性能优化中是不可或缺的,面试中也是经常被问到的点。
索引的概念与作用
索引是对数据库表中一列或多列的值进行排序的结构,记住它是一种用于快速定位数据的数据结构,下篇会补充介绍这种数据结构。如果我们把存储在数据库中的数据想象成字典中的内容,索引就是这本字典的目录,它和内容是独立存储的,但它们之间是有一种对应关系的。通过索引(目录),可以快速找到特定的数据行(内容),而无需扫描整个表,从而显著提高查询性能。
索引的创建与管理
在数据库中,可以使用 CREATE INDEX 语句来创建索引。其基本语法为:
CREATE INDEX index_name ON table_name (column_name);
例如,为 “Orders” 表的 “CustomerID” 字段创建名为 “idx_customID” 的索引,可以使用以下语句:
CREATE INDEX idx_customID ON dbo.Orders (CustomerID);
也可以通过界面来添加索引,例如Navicat中如下图所示,选择字段和索引类型保存添加就可以了:
当索引不再需要或想要重新创建时,可以使用 DROP INDEX 语句或者在界面上找到对应的索引进行删除。其语法为:
DROP INDEX index_name ON table_name;
常见索引类型
一、聚集索引
-
概念
-
聚集索引(Clustered Index)决定了表中数据的物理存储顺序。在一个表中只能有一个聚集索引,因为数据在磁盘上只能有一种物理存储顺序。它就像字典中的拼音目录,目录中a,b,c......的顺序跟我们内容的顺序是一致的,聚集索引的键值决定了数据行的实际存储位置。
-
-
特点
-
聚集索引对查询性能的提升是最显著的,尤其对于涉及范围查询的操作。数据库可以快速定位起始和结束记录,并且中间的记录在物理存储上是连续的,这有利于批量读取数据,减少磁盘 I/O 次数。
-
由于数据行的物理顺序与聚集索引键值顺序一致,所以聚集索引能够提供高效的排序和分组。当查询语句中包含 ORDER BY 或 GROUP BY 子句,并且排序或分组的列是聚集索引键时,数据库可以利用聚集索引的物理顺序快速完成排序和分组操作,而无需进行额外的排序步骤。
-
在SQL SERVER和MySQL数据库中,主键索引默认就是聚集索引,比如说之前的Student表,我只设置了主键并没有显示创建索引,但可以看到数据库中已经有一个主键(聚集)索引了:
-
二、非聚集索引
-
概念
-
非聚集索引(Non - Clustered Index)是一种独立于数据存储的索引结构。它包含索引键值以及指向对应数据行的指针(在 SQL Server 中指向数据行的键值,在 MySQL中指向数据行的物理地址)。
-
-
特点
-
一个表可以有多个非聚集索引,这为不同的查询条件提供了多种快速定位数据的途径。例如,一个学生信息表可以同时在姓名、学号和专业字段上创建非聚集索引,以满足不同查询需求。
-
非聚集索引的查询性能相对聚集索引略低,因为需要两次 I/O 操作。第一次是读取非聚集索引页找到数据行的指针,第二次是根据指针去读取实际的数据行。不过,对于某些特定的查询条件,非聚集索引仍然能显著减少查询时间。
-
-
应用场景
-
当表中存在多个不同的查询条件,并且这些条件对应的列不是聚集索引键时,可以为这些列创建非聚集索引。例如,在一个员工信息表中,经常根据员工姓名或部门进行查询,但聚集索引已经用于员工编号字段,这时可以为姓名和部门字段创建非聚集索引。
-
对于一些低频率更新但高频率查询的列,创建非聚集索引可以提高查询效率。比如在产品信息表中的产品名称字段,如果产品名称很少修改但经常被用于查询,适合创建非聚集索引。
-
不同的维度和不同的数据库,对索引的分类略有不同,但理解了上述两种索引我觉得就可以了。还有例如根据索引包含列的个数,可分为单列索引和组合索引,单列索引只包含单个列,一个表可以有多个单列索引,组合索引包含多个列。
索引的优缺点
索引的优点已经说过了:可以提高查询效率;可以对数据进行预排序,使得排序和分组查询操作更加高效。但是也要注意索引的缺点:
-
因为索引本身需要占用额外的存储空间来存储,这可能会对数据库的存储资源造成一定压力。
-
影响数据修改性能:当对表中的数据进行插入、更新或删除操作时,数据库需要维护索引(就好比你将一本书的内容做了调整,是不是也得更新一下目录),这会增加这些操作的执行时间。因此,不建议给频繁更新的字段列添加索引。
好了,关于索引的基础知识今天就介绍这些,由于索引的内容较多,后面还会写两篇文章来讲下索引的实际使用和索引底层的B+树结构。希望这篇文章对你有帮助。如果你在学习或工作中遇到相关问题,欢迎随时交流探讨!博客文章更新可能没那么及时,欢迎大家关注同名微信公众号:数据码头,有很多干货内容分享。