关于这几个概念的理解
首先要知道索引是一种数据结构,这个数据结构是由数据库本身来维护的,当删除、插入、更新数据的时候,索引自身的数据结构也在不断维护中。
索引是基于二叉树的结构来维护的,主要是为了快速检索数据
二叉树结构中有叶节点和非叶节点,叶节点就是没有分支的最后节点,顾名思义就像叶子一样
那么聚集索引,聚集索引的叶节点存储的就是数据本身,这就意味着,聚集索引决定了数据的物理存储顺序。因此聚集索引在单叶节点中是一个连续存储的数据。所以对于between < > 等范围查询,聚集索引效率会很高,因为数据本身就是连续存储的,但是对于频繁更新的列不适合聚集索引,为什么?因为会频繁更改变数据的物理地址,会影响性能。这里要说明的是,对于guid类型的主键列,聚集索引和非聚集索引那种更合适?个人认为非聚集索引更合适了,因为guid类型不会用到范围查询,只有=查询,所以没有必要使用聚集索引,但是对于自增列类型的,可以使用聚集索引,还有就是时间列,会经常用到> < =查询也是适合聚集索引。聚集索引非常珍贵,因为一张表只有一个聚集索引,所以不要将聚集索引浪费在一个guid列中,在sqlserver数据库中,主键默认的索引是聚集索引。
建索引时,如果存在聚集索引,应该先建立聚集索引,然后建立非聚集索引,否则会导致所有的非聚集索引重建。
那么非聚集索引,非聚集索引的叶节点存储的不是数据,而是数据的物理地址,就像指针一样,指向的是数据的地址,所以非聚集索引是一个非连续的数据。对于频繁更新的索引列,并没有更新实际的物理存储地址,所以频繁更新的列如果建立索引采用非聚集索引最合适,对于大数目的不同值适合非聚集索引,但是对于极少的不同值,建立索引就没有多少意义了,举个简单的例子,假如有100万条数据,类型只有AB两种,那么不会起到快速检索的效果。因此建立索引的原则不是越多越好,要根据实际情况建立。
主键是一种特殊的具有唯一约束的索引,可以是聚集索引或者非聚集索引,主键不可以为空,唯一约束的索引可以为空
最后总结一下主键、聚集索引、非聚集索引的使用
1.如果表中没有特别的列要必须使用聚集索引,建议将主键设为聚集索引
2.如果表中某列频繁使用范围查询,用到排序,譬如时间列,建议将主键设为非聚集索引,将排序列设为聚集索引
3.将大数目的不同值的列设为非聚集索引,譬如数据表中的门店ShopID、部门ID等