欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于SQL索引的理解

程序员文章站 2022-05-03 20:29:48
索引是对表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。 例如这样一个查询:select *from table1 where id = 44。如果没有索引,必须遍历整...

索引是对表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

例如这样一个查询:select *from table1 where id = 44。如果没有索引,必须遍历整个表,直到id等于44的这一行被找到为止;有了索引之后(必须是在id这一列上建立的索引),直接在索引里面找44(也就是在id这一列找),就可以得知这一行的位置,也就是找到了这一行。可见,索引是用来定位的。 建立索引的目的是加快对表中记录的查找或排序。为表设置索引要付出代价的:

一是增加了数据库的存储空间,

二是在插入和修改数据时要花费

较多的时间(因为索引也要随之变动)

sql中的索引分为两种,一种为聚集索引和非聚集索引,下面介绍两者的异同。

一、聚集索引与非聚集索引:

1、聚集索引:

聚集索引的意思可以理解为顺序排列,比如一个主键自增的表即为聚集索引,即id为1的存在于第一条,id为2的存在于第二条...假使数据库中是使用数组来存放的这张表中的数据,那么如果我需要查找第100条,那么直接第一条数据的地址加上100即为第一百条的地址,一次就能查询出来。

因为数据库中的数据只能按照一个顺序进行排列,所以聚集索引一个数据库只能有一个。在mysql中,不能自己创建聚集索引,主键即为聚集索引,如果没有创建主键,那么默认非空的列为聚集索引,如果没有非空的列那么会自动生成一个隐藏列为聚集索引。

所以一般在mysql中,我们创建的主键即为聚集索引,数据是按照我们的主键顺序进行排列。所以在根据主键进行查询时会非常快。

2、非聚集索引:

非聚集索引可以简单理解为有序目录,是一种以空间换取时间的方法。举个例子,在一个user表中,有一个id_num,即身份号,此不为主键id,那么这些数据在存储的时候都是无序的,比如

id为1的id_num为100,id为2的id_num为97,id为3的id_num为98,id为4的id_num为99,id为5的id_num为96。。。id为67的id_num为56。。。

那么如果我要查找id_num为56的人,那么只能一条一条的遍历,n条就需要查询n次,时间复杂度为o(n),这是非常耗费性能的。

所以,现在就需要为id_num增加非聚集索引,添加了非聚集索引后,会给id_num进行排序(内部使用结构为b+树),并且排序后,我只需要查询此目录(即查询b+树),很快就知道为id为56的在数据库中的第67条,而不需要在去遍历表中的所有数据。

所以,在非聚集索引中,不重复的数据越多,那么索引的效率越高。