• 聚集索引、非聚集索引、主键


    关于这几个概念的理解

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

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    【WIN32API&DAPI】窗口相关函数
    第十四章_安全性
    android实现gif图与文字混排
    Extjs 4.2 设置buttontext为中文
    HDU 5384 Danganronpa (AC自己主动机模板题)
    bzoj2938【Poi2000】病毒
    [Java开发之路](9)对象序列化与反序列化
    atitit.jndi的架构与原理以及资源配置and单元測试实践
    QueryError:Incorrect result size: expected 1, actual 0
    LightOJ 1070 Algebraic Problem (推导+矩阵高速幂)
  • 原文地址:https://www.cnblogs.com/njcxwz/p/6400575.html
Copyright © 2020-2023  润新知