风也温柔

计算机科学知识库

数据库索引 数据结构 telephone 为空 唯一索引_SQL索引

  什么是索引(Index)。数据库中的索引,就好⽐⼀本书的目录,它可以帮我们快速进行特定 值的定位与查找,从而加快数据查询的效率。

  索引就是帮助数据库管理系统高效获取数据的数据结构。

  1、什么情况下创建索引,什么时候不需要索引? 

  2、索引的种类有哪些?

  今天通过这篇文章让你真正了解索引。

  什么情况下创建索引,什么时候不需要索引?主键自动建立唯一索引频繁作为查询条件的字段应该创建索引查询中排序的字段创建索引将大大提高排序的速度(索引就是排序加快速查找查询中统计或者分组的字段;频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件where条件里用不到的字段,不创建索引;表记录太少,不需要创建索引;经常增删改的表;数据重复且分布平均的字段,因此为经常查询的和经常排序的字段建立索引。注意某些数据包含大量重复数据,因此他建立索引就没有太大的效果,例如性别字段,只有男女,不适合建立索引。索引的种类有哪些?

  虽然使用索引的本质目的是帮我们快速定位想要查找的数据,但实际上,索引有很多种类。

  从功能逻辑上说,索引主要有 4 种,分别是普通索引、唯⼀索引、主键索引和全文索引。

  数据库索引 数据结构_行为数据是什么结构数据_索引是什么结构

  普通索引:最基本的索引,它没有任何限制唯一索引:索引列的值必须唯一,且不能为空,如果是组合索引,则列值的组合必须唯一。主键索引:特殊的索引,唯一的标识一条记录,不能为空,一般用 key来约束。全文索引:全文索引时将存储在数据库中的整本书或整篇文章中的任意内容信息查找出来的技术。它可以根据需要获取全文中有关章,节,段,句,词等信息,也可以进行各种统计和分析。

  普通索引是基础的索引,没有任何约束,主要⽤于提⾼查询效率。

  唯⼀索引就是在普通索引的基础上增加了数据 唯⼀性的约束,在⼀张数据表⾥可以有多个唯⼀索引。

  主键索引在唯⼀索引的基础上增加了不为空的约束,也就 是 NOT NULL,⼀张表⾥最多只有⼀个主键索引。

  全⽂索引用的不多,MySQL自带的全文索引只支持英文。我们通常可以采用专⻔的全⽂搜索引擎,⽐如 ES ) 和 Solr。

  按照物理实现⽅式,索引可以分为 2 种:聚集索引和非聚集索引。我们也把聚集索引称为⼆级索引或者辅助索引

  什么是聚集索引和非聚集索引

  聚集索引:类似字典正文内容本身就是一种按照一定规则排列的目录

  非聚集索引:这种目录纯粹是目录,正文纯粹是正文的排序方式

  每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序 。

  聚集索引与⾮聚集索引的原理不同数据库索引 数据结构 telephone 为空 唯一索引_SQL索引,在使⽤上也有⼀些区别: 

  聚集索引的叶⼦节点存储的就是我们的数据记录,⾮聚集索引的叶⼦节点存储的是数据位置。⾮聚集索引不 会影响数据表的物理存储顺序。 ⼀个表只能有⼀个聚集索引,因为只能有⼀种排序存储的⽅式,但可以有多个⾮聚集索引,也就是多个索引目录提供数据检索。 使用聚集索引的时候,数据的查询效率⾼,但如果对数据进⾏插⼊,删除,更新等操作,效率会⽐⾮聚集索引低。什么是 B 树

  B 树的英⽂是 Tree,也就是平衡的多路 搜索树,它的⾼度远⼩于平衡⼆叉树的⾼度。在⽂件系统和数据库系统中的索引结构 经常采⽤ B 树来实现。

  B 树的结构如下图所示:

  索引是什么结构_数据库索引 数据结构_行为数据是什么结构数据

  什么是 B+ 树

  B+树基于 B 树做出了改进,主流的 DBMS 都⽀持 B+树的索引⽅式,⽐如 MySQL。B+树和 B 树的差异在于以下⼏点: 

  有 k 个孩⼦的节点就有 k 个关键字。也就是孩子数量 = 关键字数,而B 树中, 孩⼦数量 = 关键字数+1。 非叶子节点的关键字也会同时存在在⼦节点中,并且是在⼦节点中所有关键字的 最⼤(或最⼩)。 非叶子节点仅⽤于索引,不保存数据记录,跟记录有关的信息都放在叶子节点 中。⽽ B 树中,非叶子节点既保存索引,也保存数据记录。 所有关键字都在叶子节点出现,叶子节点构成⼀个有序链表,⽽且叶子节点本⾝ 按照关键字的大小从小到大顺序链接。

  下图就是⼀棵 B+树,阶数为 3,根节点中的关键字 1、18、35 分别是⼦节点(1, 8,14),(18,24,31)和(35,41,53)中的最⼩值。每⼀层⽗节点的关键字都会出现在下⼀层的⼦节点的关键字中,因此在叶⼦节点中包括了所有的关键字信息,并且每⼀个叶⼦节点都有⼀个指向下⼀个节点的指针,这样就形成了⼀个链表。

  比如,我们想要查找关键字 16,B+ 树会⾃顶向下逐层进行查找: 

  索引是什么结构_数据库索引 数据结构_行为数据是什么结构数据

  1、与根节点的关键字,(1,18,35)进⾏⽐较,16 在 1 和 18 之间,得到指针 P1(指 向磁盘块 2) 

  2、 找到磁盘块 2,关键字为(1,8,14),因为 16 ⼤于 14,所以得到指针 P3(指向磁盘块 7) 

  3、找到磁盘块 7数据库索引 数据结构,关键字为(14数据库索引 数据结构,16,17),然后我们找到了关键字 16,所以可以 找到关键字 16 所对应的数据。

  B+树和 B 树有个根本的差异在于,B+树的中间节点并不直接存储数据。⾸先,B+树查询效率更稳定。因为 B+树每次只有访问到叶⼦节点才能找到对应的数据,⽽在 B 树中,⾮叶⼦节点也会存储数据,这样就会造成查询效率不稳定的情况,有时候访问到了⾮叶⼦节点就可以找到关键字,⽽有时需要访问到叶⼦节点才能找到 关键字。 其次,B 树的查询效率更⾼,这是因为通常 B 树⽐ B 树更矮胖(阶数更⼤,深度 更低),查询所需要的磁盘 I/O 也会更少。同样的磁盘⻚⼤⼩,B 树可以存储更多 的节点关键字。 不仅是对单个关键字的查询上,在查询范围上,B 树的效率也⽐ B 树⾼。这是因为 所有关键字都出现在 B 树的叶⼦节点中,并通过有序链表进⾏了链接。⽽在 B 树中 则需要通过中序遍历才能完成查询范围的查找,效率要低很多。

  哈希索引

  哈希索引基本散列表实现,散列表(也称哈希表)是根据关键码值(Key value)而直接进行访问的数据结构,它让码值经过哈希函数的转换映射到散列表对应的位置上,查找效率非常高。假设我们对名字建立了哈希索引,则查找过程如下图所示:

  对于每一行数据,存储引擎都会对所有的索引列(上图中的 name 列)计算一个哈希码(上图散列表的位置),散列表里的每个元素指向数据行的指针,由于索引自身只存储对应的哈希值,所以索引的结构十分紧凑,这让哈希索引查找速度非常快!当然了哈希表的劣势也是比较明显的,不支持区间查找,不支持排序,所以更多的时候哈希表是与 B Tree等一起使用的。

  索引设计准则:三星索引

  如果一个查询满足三星索引中三颗星的所有索引条件,理论上可以认为我们设计的索引是最好的索引。什么是三星索引

  第一颗星:WHERE 后面参与查询的列可以组成了单列索引或联合索引第二颗星:避免排序,即如果 SQL 语句中出现 order by ,那么取出的结果集就已经是按照 排序好的,不需要再生成临时表第三颗星: 对应的列应该尽量是索引列,即尽量避免回表查询。

  综上所述,三星索引只是给我们构建索引提供了一个参考,索引设计应该尽量靠近三星索引的标准,但实际场景我们一般无法同时满足三星索引,一般我们会优先选择满足第三颗星(因为回表代价较大)至于第一,二颗星就要依赖于实际的成本及实际的业务场景考虑。

  总结

  使⽤索引可以帮助我们从海量的数据中快速定位想要查找的数据,不过索引也存在⼀些不⾜,⽐如占⽤存储空 间、降低数据库写操作的性能等,如果有多个索引还会增加索引选择的时间。当我们使⽤索引时,需要平衡索引 的利(提升查询效率)和弊(维护索引所需的代价)。

  在实际⼯作中,我们还需要基于需求和数据本⾝的分布情况来确定是否使⽤索引,尽管索引不是万能的,但数据 量⼤的时候不使⽤索引是不可想象的,毕竟索引的本质,是帮助我们提升数据检索的效率。

  文章来源:https://daimajiaoliu.com/daima/8c7511d6b54e805