想要了解索引,必须了解一种很重要的数据结构「平衡树」(非二叉),也就是常说的B+树。主流的RDBMS都是把平衡树当做数据表默认的索引数据结构。
平衡树-b+树
原理:https://blog.csdn.net/qq_26222859/article/details/80631121
动态演示:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
聚集索引
首先我们要明白,没有索引的表在存储空间中时一条一条的排列的.我们在mysql中创建表时,如果没有定义主键,那么数据库会拒绝执行表的创建语句,如果表数据中存在主键,那么数据的存储结构会变长b+树,b+树的节点为主键的值,叶子存放数据的全部信息。
拥有主键的表就是一个索引, 这就是为什么一个表只能有一个主键, 一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。
非聚集索引
非聚集索引和聚集索引一样, 同样是采用平衡树作为索引的数据结构.非聚集索引节点的值是作为非聚集索引的字段的值,与聚集索引不同的是,非聚集索引的b+树叶子存放的是对应数据的主键id的值。也就是说非聚集索引走后也会通过聚集索引来查询到对应的数据信息。每次数据的增、删、改操作都会复制一份数据出来用于非聚集索引的修改调整,这也是为什么非聚集索引过多,使得数据修改执行效率变低的原因。
覆盖索引
从非聚集索引与聚集索引的关系我们可以知道 所有的非聚集索引最后都要归结到聚集索引上,但是也有一种索引方式不需要查询聚集索引这就是覆盖索引。
当为字段建立索引以后, 字段中的内容会被同步到索引之中, 如果为一个索引指定两个字段, 那么这个两个字段的内容都会被同步至索引之中。如果我们要查询的数据是通过索引靠左数据字段,查询其紧挨着的靠右数据字段,那么便可以直接通过b+树的节点找到对应的数据。俄日不需要在通过聚合索引。