索引是什么
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息
精简来说,索引是一种结构,索引和表(这里指的是加了聚集索引的表)的存储结构是一样的,都是B树,B树是一种用于查找的平衡多叉树
一个表或索引没有使用B树(没有聚集索引的表是使用堆heap存储),那么查找一个数据,需要在整个表包含的数据库页中全盘扫描。而使用B树进行存储,经过几次查找后就可以找到存放所需数据的被叶子节点包含的页,进而避免的全盘扫描从而提高了性能。
理解聚集索引
聚集的作用就是将某一列(或是多列)的物理顺序改变为和逻辑顺序相一致

聚集索引的存储是以B树存储,B树的叶子直接存储聚集索引的数据
因为聚集索引改变的是其所在表的物理存储顺序,所以每个表只能有一个聚集索引
理解非聚集索引
非聚集索引,本质上来说也是聚集索引的一种。非聚集索引并不改变其所在表的物理结构,而是额外生成一个聚集索引的B树结构
但叶子节点是对于其所在表的引用,这个引用分为两种:1.表上没有聚集索引,则引用行号。2.表上已经有了聚集索引,则引用聚集索引的页
B树的叶子节点存的是指向堆或聚集索引的指针
聚集索引VS非聚集索引
大多数情况下,聚集索引的速度比非聚集索引要略快一些.因为聚集索引的B树叶子节点直接存储数据,而非聚集索引还需要额外通过叶子节点的指针找到数据
索引的代价
1.当表建立索引后,就以B树来存储数据.所以当对其进行更新插入删除时,就需要页在物理上的移动以调整B树.因此当更新插入删除数据时,会带来性能的下降
2.
非聚集索引需要额外的磁盘空间(因为非聚集索引相当于是一个表,只不过是用来存储聚集索引的引用指针和指向数据行的定位器)
3.
不恰当的非聚集索引反而会降低性能(
对于大量连续数据查找,非聚集索引十分乏力,因为非聚集索引需要在非聚集索引的B树中找到每一行的指针,再去其所在表上找数据,性能因此会大打折扣.有时甚至不如不加非聚集索引
)