数据库索引

475 阅读3分钟

一个加了主键的表,并不能被称之为「表」。一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐, 跟我认知中的「表」很接近。如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,也就是上面说的「平衡树」结构,换句话说,就是整个表就变成了一个索引。一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置

上图就是带有主键的表(聚集索引)的结构图。图画的不是很好, 将就着看。其中树的所有结点(底部除外)的数据都是由主键字段中的数据构成,也就是通常我们指定主键的id字段,就是每个内部节点都是由主键字段中的数据组成的

然而, 事物都是有两面的, 索引能让数据库查询数据的速度上升, 而使写入数据的速度下降,原因很简单的, 因为平衡树这个结构必须一直维持在一个正确的状态, 增删改数据都会改变平衡树各节点中的索引数据内容,破坏树结构, 因此,在每次数据改变时, DBMS必须去重新梳理树(索引)的结构以确保它的正确,这会带来不小的性能开销,也就是为什么索引会给查询以外的操作带来副作用的原因。

非聚集索引

索引树结构中各节点的值来自于表中的索引字段, 假如给user表的name字段加上索引 , 那么索引就是由name字段中的值构成,在数据改变时, DBMS需要一直维护索引结构的正确性

如果给表中多个字段加上索引 , 那么就会出现多个独立的索引结构,每个索引(非聚集索引)互相之间不存在关联。每次给字段建一个新索引, 字段中的数据就会被复制一份出来, 用于生成索引。 因此, 给表添加索引,会增加表的体积, 占用磁盘存储空间。

聚集索引和非聚集索引的区别:

非聚集索引和聚集索引的区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据

不管以任何方式查询表, 最终都会利用主键通过聚集索引来定位到数据, 聚集索引(主键)是通往真实数据所在的唯一路径。

覆盖索引/多字段索引

当为字段建立索引以后, 字段中的内容会被同步到索引之中, 如果为一个索引指定两个字段, 那么这个两个字段的内容都会被同步至索引之中

假如利用属性列A,B建立覆盖索引,当通过条件A取得B的值时,我们只需要通过条件A得到叶子节点,叶子节点中含有主键,A,B的值此时就可以直接返回B的值而不用通过主键再去对聚集索引进行查找了。

索引分类

  • 主键索引 PRIMARY KEY

  • 唯一索引 UNIQUE KEY

  • 常规索引 KEY/INDEX

  • 全文索引 FullText

    • 在特定的数据库引擎下才有,如MyISAM

    • 快速定位数据

在一个表中主键索引只有一个,唯一索引可以多个(定义表中的多个列为唯一索引)

增加索引

  • 第一种

    ALTER TABLE 表名 ADD FULLTEXT INDEX 索引名(列名) 为某列添加了全文索引

  • 第二种

    CREATE INDEX 索引名 on 表(列名)

    以上内容是自己学习的总结,如果错误或者不足请指出谢谢!

参考博客www.cnblogs.com/aspwebchh/p…