索引分为聚集索引和非聚集索引,我们平时建表时用到的主键其实就是聚集索引,大部分的查询操作,最后都是通过聚集索引也就是主键才得到想要的数据的。
聚集索引
加了主键以后,整个表就按照主键形成了平衡树结构,其他信息都存储在叶结点。与不加主键相比,查询时间复杂度从O(n)变成了O(logn)
非聚集索引
非聚集索引也就是我们平时所说的常规索引,它的使用场景如下:
我们在查询时并不知道主键的值,而是通过其他字段形成的查询条件,而如果不通过主键查询,时间复杂度就会上升到O(n),所以这时候我们可以针对我们在查询条件中使用到的字段创建索引,这样就能大大加快查询速度。例如这条语句:
select age from students where name='张三'
我们就可以针对name字段创建索引:
create index name_index on students(name)
这样就能在索引中快速查询到对应的主键值,再用这个主键值去主表中查询我们需要的age字段。还有一种方法,可以省略这第二个步骤,直接在索引中查询出想要的值,也就是复合索引:
create index name_and_age_index on students(name,age)
这样就能直接在索引中查出想要的age数据,速度进一步加快
需要注意,使用复合索引时,要遵循最左前缀匹配原则,例如:
create index name_and_age_index on students(name,sex,age)
那么我们的查询条件必须要这么写:
where name=" " and sex=" " and age=" "
或
where name=" " and sex=" "
或
where name=" "
除以上三种写法之外,其他写法都会使索引失效。也就是如果有字段不在它正确的位置上,那么从它那一级开始,索引就失效了。可以这么理解,复合索引是一个递归的平衡树,在第一个字段的平衡树叶结点中存放着第二个字段的平衡树,所以必须按照固定顺序编写查询条件
需要注意的是,创建索引相当于新建了一张表,它会占用额外的存储空间。更重要的是,在对表进行更新、插入、删除操作时,需要同步对索引进行更改,所以虽然查询速度变快了,但更新、插入、删除操作的速度会受到一定影响