一、什么是索引?
索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。
例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。
二、索引的特点
为表设置索引的优点:
- 建立索引的目的是加快对表中记录的查找或排序(最主要的原因)。
为表设置索引要付出代价的:
- 一是增加了数据库的存储空间.
- 二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。数据库索引就是为了提高表的搜索效率而对某些字段中的值建立的目录 。
三、索引分类(聚集索引与非聚集索引)
1、聚集索引:
聚集索引的意思可以理解为顺序排列,比如一个主键自增的表即为聚集索引,即id为1的存在于第一条,id为2的存在于第二条...假使数据库中是使用数组来存放的这张表中的数据,那么如果我需要查找第100条,那么直接第一条数据的地址加上100即为第一百条的地址,一次就能查询出来。
因为数据库中的数据只能按照一个顺序进行排列,所以聚集索引一个数据库只能有一个。在mysql中,不能自己创建聚集索引,主键即为聚集索引,如果没有创建主键,那么默认非空的列为聚集索引,如果没有非空的列那么会自动生成一个隐藏列为聚集索引。
所以一般在mysql中,我们创建的主键即为聚集索引,数据是按照我们的主键顺序进行排列。所以在根据主键进行查询时会非常快。
2、非聚集索引
该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。
举个例子,在一个user表中,有一个id_num,即身份号,此不为主键id。那么这些数据在存储的时候都是无序的,
比如:
- id 为 1 的 id_num 为 110,
- id 为 2 的 id_num 为 97,
- id 为 3 的 id_num 为 88,
- id 为 4 的 id_num 为 99,
- id 为 5 的 id_num 为 96
那么如果我要查找 id_num 为56 的人,那么只能一条一条的遍历,n条就需要查询n次,时间复杂度为O(n),这是非常耗费性能的。
所以,现在就需要为id_num 增加非聚集索引,添加了非聚集索引后,会给 id_num 进行排序(内部使用结构为B+树),并且排序后,我只需要查询此目录(即查询B+树),很快就知道为 id 为56的在数据库中的第 67 条,而不需要在去遍历表中的所有数据。
所以,在非聚集索引中,不重复的数据越多,那么索引的效率越高。