zoukankan      html  css  js  c++  java
  • 聚集索引、非聚集索引、主键

    关于这几个概念的理解

    首先要知道索引是一种数据结构,这个数据结构是由数据库本身来维护的,当删除、插入、更新数据的时候,索引自身的数据结构也在不断维护中。

    索引是基于二叉树的结构来维护的,主要是为了快速检索数据

    二叉树结构中有叶节点和非叶节点,叶节点就是没有分支的最后节点,顾名思义就像叶子一样

    那么聚集索引,聚集索引的叶节点存储的就是数据本身,这就意味着,聚集索引决定了数据的物理存储顺序。因此聚集索引在单叶节点中是一个连续存储的数据。所以对于between < > 等范围查询,聚集索引效率会很高,因为数据本身就是连续存储的,但是对于频繁更新的列不适合聚集索引,为什么?因为会频繁更改变数据的物理地址,会影响性能。这里要说明的是,对于guid类型的主键列,聚集索引和非聚集索引那种更合适?个人认为非聚集索引更合适了,因为guid类型不会用到范围查询,只有=查询,所以没有必要使用聚集索引,但是对于自增列类型的,可以使用聚集索引,还有就是时间列,会经常用到> < =查询也是适合聚集索引。聚集索引非常珍贵,因为一张表只有一个聚集索引,所以不要将聚集索引浪费在一个guid列中,在sqlserver数据库中,主键默认的索引是聚集索引。

    建索引时,如果存在聚集索引,应该先建立聚集索引,然后建立非聚集索引,否则会导致所有的非聚集索引重建。

    那么非聚集索引,非聚集索引的叶节点存储的不是数据,而是数据的物理地址,就像指针一样,指向的是数据的地址,所以非聚集索引是一个非连续的数据。对于频繁更新的索引列,并没有更新实际的物理存储地址,所以频繁更新的列如果建立索引采用非聚集索引最合适,对于大数目的不同值适合非聚集索引,但是对于极少的不同值,建立索引就没有多少意义了,举个简单的例子,假如有100万条数据,类型只有AB两种,那么不会起到快速检索的效果。因此建立索引的原则不是越多越好,要根据实际情况建立。

    主键是一种特殊的具有唯一约束的索引,可以是聚集索引或者非聚集索引,主键不可以为空,唯一约束的索引可以为空

    最后总结一下主键、聚集索引、非聚集索引的使用

    1.如果表中没有特别的列要必须使用聚集索引,建议将主键设为聚集索引

    2.如果表中某列频繁使用范围查询,用到排序,譬如时间列,建议将主键设为非聚集索引,将排序列设为聚集索引

    3.将大数目的不同值的列设为非聚集索引,譬如数据表中的门店ShopID、部门ID等

  • 相关阅读:
    [ASPNET2.0]Membership类+SQLServer2005,AspNet_regsql.exe的使用
    Tooltip的几个技巧(转自网络)
    使用aspnet_regsql.ext命令行工具后,就不能用sql语句创建新的表了,总是显示已存在XXX对象。
    我已经无可救药
    陈彩君(帮别人名字作诗)
    震后首游都江堰感怀(二)
    克服创业前的恐惧:31条建议帮你有勇气做自己的老板
    想你已经成为了一种习惯
    诸葛亮给儿子上的十堂课
    一生中,这8种朋友是你的无价之宝
  • 原文地址:https://www.cnblogs.com/njcxwz/p/6400575.html
Copyright © 2011-2022 走看看